gpt4 book ai didi

linux - 使用 awk 去除 2 种模式之外的文本文件部分

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:59 25 4
gpt4 key购买 nike

我想要一个优雅的 awk 解决方案来编辑​​文件中的行。到目前为止,我只设法使用 2 个 sed 命令和 1 个 awk 命令完成了任务。

每个文件都由一个不确定长度的标题组成,后跟我要捕获的数据,然后是一个始终以相同字符串 (WATER) 开头的页脚。数据由几个 3 行 block 组成,我想将它们连接成单行,每个 3 行 block 以相同的字符串 (GROUPS) 开头。

每当我找到 GROUPS 时,将以下行连接起来,直到下一次出现 GROUPS 并重复,直到找到 WATER,删除 WATER 行,以及文件末尾的所有后续行。

输入:

header stuff
more header stuff
even more header stuff
GROUPS data data data data
mo data mo data mo data
even more even more
GROUPS data data data data
mo data mo data mo data
even more even more
GROUPS data data data data
mo data mo data mo data
even more even more
.......
last line of data
WATER footer stuff footer stuff
footer stuff
more footer stuff
even more footer stuff

输出:

GROUPS data data data data mo data mo data mo data even more even more
GROUPS data data data data mo data mo data mo data even more even more
GROUPS data data data data mo data mo data mo data even more even more
........
GROUPS data data data data mo data mo data even more last line of data

如有任何帮助,我们将不胜感激!

编辑:

这是我的(可能是片状的)解决方案!

1:修剪表头

sed -n '/"GROUPS"/,$p' originalfile > outputfile1

2:修剪页脚

sed '/"WATER"/,$d' outputfile1 > outputfile2

3:连接行

awk 'NF&&$1=RS$1' RS="GROUPS" outputfile2 > finaloutputfile

最佳答案

这是一个 gnu awk(gnu 由于记录分隔符中有多个字符)

awk -v RS="GROUPS|WATER" -F"\n" 'p=="WATER"{exit} {$1=p $1}NR>1; {p=RT}' file
GROUPS data data data data mo data mo data mo data even more even more
GROUPS data data data data mo data mo data mo data even more even more
GROUPS data data data data mo data mo data mo data even more even more ....... last line of data

通过将 RS 设置为 GROUPSWATER 并重新创建行 $1=p $1 它使一切合而为一行。
如果行以 WATER 开头,则退出。这样,WATER 及以下不再打印任何行。
p 设置为之前的 RT(使用的分隔符)

关于linux - 使用 awk 去除 2 种模式之外的文本文件部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com