Unix 在awk中找到下一个的方法

Unix 在awk中找到下一个的方法,unix,awk,Unix,Awk,如果前一行符合条件,我必须打印下一行 包含以下内容的文件a.dat 1 2 3 1 2 1 如果$1与3匹配,则打印1(下一行)。我用下面的awk语句试过了 awk ' { if($1=="3") { {next} {print $1} } }' a.dat 但它不起作用。当我寻找它时,我知道当awk遇到一个next时,不会对当前记录执行进一步的规则,因此我得到了一个空结果。有没有一种方法可以通过使用awk的next本身来解决这个问题 awk '/bbbbb/{a=1;next}a{prin

如果前一行符合条件,我必须打印下一行

包含以下内容的文件
a.dat

1
2
3
1
2
1
如果$1与3匹配,则打印1(下一行)
。我用下面的awk语句试过了

awk ' { if($1=="3") { {next} {print $1} } }' a.dat
但它不起作用。当我寻找它时,我知道当awk遇到一个
next
时,不会对当前记录执行进一步的规则,因此我得到了一个空结果。有没有一种方法可以通过使用awk的
next
本身来解决这个问题

awk '/bbbbb/{a=1;next}a{print;a=0}' File
正在搜索的模式是
bbbbb
。如果找到模式,将变量
a设置为1
。转到下一张唱片。如果
a
为1,则打印记录并取消设置
a
。这将为与
模式匹配的所有行打印下一行

示例:

AMD$ cat File
aaaaa
bbbbb
ccccc
ddddd
eeeee
aaaaa
bbbbb
ccccc
ddddd
eeeee
AMD$ awk '/bbbbb/{a=1;next}a{print;a=0}' File
ccccc
ccccc
正在搜索的模式是
bbbbb
。如果找到模式,将变量
a设置为1
。转到下一张唱片。如果
a
为1,则打印记录并取消设置
a
。这将为与
模式匹配的所有行打印下一行

示例:

AMD$ cat File
aaaaa
bbbbb
ccccc
ddddd
eeeee
aaaaa
bbbbb
ccccc
ddddd
eeeee
AMD$ awk '/bbbbb/{a=1;next}a{print;a=0}' File
ccccc
ccccc

你说“比赛3”的时候不清楚如果您的意思是包含3或数字等于3或字符串等于3或其他内容,或者如果您希望打印3后面的每一行或仅打印第一行,或者如果您希望打印包含3的行,如果前一行是3或跳过,直到达到非3,但一般方法将基于:

awk 'f{print; f=0} $0==3{f=1}' file
甚至:

awk 'f&&f--; $0==3{f=1}' file

变量
f
通常用于表示
found
。请参阅,了解如何在与awk匹配后打印行。

当您说“匹配3”时,不清楚如果您的意思是包含3或数字等于3或字符串等于3或其他内容,或者如果您希望打印3后面的每一行或仅打印第一行,或者如果您希望打印包含3的行,如果前一行是3或跳过,直到达到非3,但一般方法将基于:

awk 'f{print; f=0} $0==3{f=1}' file
甚至:

awk 'f&&f--; $0==3{f=1}' file

变量
f
通常用于表示
found
。有关如何在与awk匹配后通常打印行的信息,请参阅。

如果模式为真,则将打印下一行:

awk '_-->0;$1==3{_=1}' file
4
一些更具可读性的

awk 'f-->0;$1==3{f=1}' file
或者像埃德建议的那样

awk 'f&&f--;$1==3{f=1}' file

另一种变体

awk '/^3$/{f=1;next} f-->0' file

如果模式为真,将打印下一行:

awk '_-->0;$1==3{_=1}' file
4
一些更具可读性的

awk 'f-->0;$1==3{f=1}' file
或者像埃德建议的那样

awk 'f&&f--;$1==3{f=1}' file

另一种变体

awk '/^3$/{f=1;next} f-->0' file

++不使用
getline
(请参阅了解原因)。我会把它写成
awk'p{print;p=0}/3/{p=1}'文件
如果(a)
在一个无条件的块中,而不是
a{…
?++因为没有使用
getline
(请参见为什么不)。我会把它写成
awk'p{print;p=0}/3/{p=1}文件
为什么要用
if(a)
在一个无条件块中,而不是
a{…
?我认为
f
是用于
标志的:P
3是数字,我想打印下一行..awk'f{print;f=0}$0==3{f=1}“文件就是我要找的文件..谢谢..:)@jaypalsingh不,标志就是它,而不是它的意思。沿着这条路,会有
v
用于
变量
,尽管我和其他任何人一样,对
数组
使用
a
感到内疚,但出于某种原因,我的敏感度并不会在这条路上尖叫,只要它是明显的很明显,它在一个小脚本中的作用是:-)。我认为
f
是用于
flag
:P
3是数字的,我想打印下一行..awk'f{print;f=0}$0==3{f=1}“文件就是我要找的文件..谢谢..:)@jaypalsingh不,标志就是它,而不是它的意思。沿着这条路,会有
v
用于
变量
,尽管我和其他任何人一样,对
数组
使用
a
感到内疚,但出于某种原因,我的敏感度并不会在这条路上尖叫,只要它是明显的很明显,它在一个小脚本中的作用是:-)。我强烈怀疑命名一个变量对可读性有很大的负面影响。你为什么要这么做?它可能是变量名的第二糟糕选择,仅次于用双负数命名变量(
not un\u found=1
)。我也不会使用无保护的
f-->0
,以防输入文件太大,以致变量值返回正数-因此
f&&f--
保护停止在零处递减。@EdMorton这只是为了好玩。修复了它。听起来不错,我们不想让任何人把awk和p字混淆;-)。@EdMorton谢谢,修复了。I'strongly怀疑命名变量
\uuu
会对可读性产生显著的负面影响。你为什么要这样做?这可能是变量名的第二糟糕选择,仅次于使用双负数命名变量(
not\u un\u found=1
)。我也不会使用无保护的
f-->0
,以防输入文件太大,以致变量值返回正数-因此
f&&f--
保护停止在零处递减。@EdMorton这只是为了好玩。修复了它。听起来不错,我们不希望有人把awk和p字混淆;-)。@EdMorton谢谢,Fixed.pos可重复的可能重复的