Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用awk将文本文件中两个模式之外的部分修剪掉_Linux_Bash_Awk - Fatal编程技术网

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
设置为previous
RT
(使用的分隔符)

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

通过将
RS
设置为
GROUPS
WATER
并重新创建行
$1=p$1
,可以将所有内容都放在一行中。
如果行以水开头,则退出。这样就不会再从
和水下打印任何行。

p
设置为previous
RT
(使用的分隔符)

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

通过将
RS
设置为
GROUPS
WATER
并重新创建行
$1=p$1
,可以将所有内容都放在一行中。
如果行以水开头,则退出。这样就不会再从
和水下打印任何行。

p
设置为previous
RT
(使用的分隔符)

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

通过将
RS
设置为
GROUPS
WATER
并重新创建行
$1=p$1
,可以将所有内容都放在一行中。
如果行以水开头,则退出。这样就不会再从
和水下打印任何行。

p
设置为previous
RT
(使用的分隔符)

让我们使用艰难的方法:

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,但我还没有足够的重复!真是糟糕的一天。