Linux 使用awk将文本文件中两个模式之外的部分修剪掉
我想要一个优雅的Linux 使用awk将文本文件中两个模式之外的部分修剪掉,linux,bash,awk,Linux,Bash,Awk,我想要一个优雅的awk解决方案来编辑文件中的行。到目前为止,我只使用了2个sed命令和1个awk命令完成了任务 每个文件都由一个长度不确定的页眉组成,后面是我想要捕获的数据,然后是一个页脚,页脚总是以相同的字符串(WATER)开头。数据由几个3行数据块组成,我想将它们连接成一行,每个3行数据块以相同的字符串(组)开始 每当我找到组时,将以下行连接起来,直到下一个组出现,然后重复,直到找到水为止,删除水行,并删除文件末尾的所有后续行 输入: header stuff more header stu
awk
解决方案来编辑文件中的行。到目前为止,我只使用了2个sed
命令和1个awk
命令完成了任务
每个文件都由一个长度不确定的页眉组成,后面是我想要捕获的数据,然后是一个页脚,页脚总是以相同的字符串(WATER)开头。数据由几个3行数据块组成,我想将它们连接成一行,每个3行数据块以相同的字符串(组)开始
每当我找到组时,将以下行连接起来,直到下一个组出现,然后重复,直到找到水为止,删除水行,并删除文件末尾的所有后续行
输入:
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由于记录分隔符中有多个字符)
通过将RS
设置为GROUPS
和WATER
并重新创建行$1=p$1
,可以将所有内容都放在一行中。如果行以水开头,则退出。这样就不会再从
水
和水下打印任何行。p
设置为previousRT
(使用的分隔符)这里是一个gnu awk
(gnu由于记录分隔符中有多个字符)
通过将RS
设置为GROUPS
和WATER
并重新创建行$1=p$1
,可以将所有内容都放在一行中。如果行以水开头,则退出。这样就不会再从
水
和水下打印任何行。p
设置为previousRT
(使用的分隔符)这里是一个gnu awk
(gnu由于记录分隔符中有多个字符)
通过将RS
设置为GROUPS
和WATER
并重新创建行$1=p$1
,可以将所有内容都放在一行中。如果行以水开头,则退出。这样就不会再从
水
和水下打印任何行。p
设置为previousRT
(使用的分隔符)这里是一个gnu awk
(gnu由于记录分隔符中有多个字符)
通过将RS
设置为GROUPS
和WATER
并重新创建行$1=p$1
,可以将所有内容都放在一行中。如果行以水开头,则退出。这样就不会再从
水
和水下打印任何行。p
设置为previousRT
(使用的分隔符)让我们使用艰难的方法:
awk '/^GROUPS/ {if (string) print string; f=1; string=$0; next}
/^WATER/ {print string; f=0}
f {string=string" "$0}' file
当找到组
时,开始“记录”变量字符串
中的行,当找到水
时停止记录。当看到组时
,也打印存储的字符串(如果存在)并为下一次迭代清理它
试验
让我们用艰苦的方式:
awk '/^GROUPS/ {if (string) print string; f=1; string=$0; next}
/^WATER/ {print string; f=0}
f {string=string" "$0}' file
当找到组
时,开始“记录”变量字符串
中的行,当找到水
时停止记录。当看到组时
,也打印存储的字符串(如果存在)并为下一次迭代清理它
试验
让我们用艰苦的方式:
awk '/^GROUPS/ {if (string) print string; f=1; string=$0; next}
/^WATER/ {print string; f=0}
f {string=string" "$0}' file
当找到组
时,开始“记录”变量字符串
中的行,当找到水
时停止记录。当看到组时
,也打印存储的字符串(如果存在)并为下一次迭代清理它
试验
让我们用艰苦的方式:
awk '/^GROUPS/ {if (string) print string; f=1; string=$0; next}
/^WATER/ {print string; f=0}
f {string=string" "$0}' file
当找到组
时,开始“记录”变量字符串
中的行,当找到水
时停止记录。当看到组时
,也打印存储的字符串(如果存在)并为下一次迭代清理它
试验
这看起来很棒,尽管我已经意识到我的问题有缺陷,PATTERN1和PATTERN2代表两个完全不同的字符串。因此,将单词模式用作RS是行不通的。我正在编辑这篇文章。对不起@Arronic更新了我的帖子。这看起来很棒,尽管我意识到我的问题有缺陷,PATTERN1和PATTERN2代表两个完全不同的字符串。因此,将单词模式用作RS是行不通的。我正在编辑这篇文章。对不起@Arronic更新了我的帖子。这看起来很棒,尽管我意识到我的问题有缺陷,PATTERN1和PATTERN2代表两个完全不同的字符串。因此,将单词模式用作RS是行不通的。我正在编辑这篇文章。对不起@Arronic更新了我的帖子。这看起来很棒,尽管我意识到我的问题有缺陷,PATTERN1和PATTERN2代表两个完全不同的字符串。因此,将单词模式用作RS是行不通的。我正在编辑这篇文章。对不起@Arronical更新了我的帖子。OP更新了他的帖子,应该很容易修复您的解决方案,只需替换
模式
s即可。但是您的测试中有一个错误,awk
在结尾处遗漏了一些字符。谢谢这一个,将+1,但我还没有足够的重复!真是糟糕的一天。感谢@Jotne再次报道!:D@Arronical没问题,欢迎光临。一旦你超过15岁,你可以回到帖子:)OP更新了他的帖子,应该很容易解决你的问题,只需更换模式。但是您的测试中有一个错误,awk
在结尾处遗漏了一些字符。谢谢这一个,将+1,但我还没有足够的重复!真是糟糕的一天。感谢@Jotne再次报道!:D@Arronical没问题,欢迎光临。一旦你超过15岁,你可以回到帖子:)OP更新了他的帖子,应该很容易解决你的问题,只需更换模式。但是您的测试中有一个错误,awk
在结尾处遗漏了一些字符。谢谢这一个,将+1,但我还没有足够的重复!真是糟糕的一天。