awk“;如果;陈述
我有一份档案awk“;如果;陈述,awk,Awk,我有一份档案 foo -- bar 我只想要分隔符上面的线。我已经挣扎了太长时间,并尝试了一些变种。我的一句话是: echo -e "foo\n-- \nbar" | gawk -v x=0 -- '/^--\ / { x++ } ; IF (x==0) {print} ' 这应该只打印“foo”,但我得到了整个文件的输出。如果我改为打印x,我得到 0 1 1 我似乎无法使awk根据x的值有条件地打印一行。我知道我错过了一些简单的东西。尝试这样做: echo -e "foo\n-- \nb
foo
--
bar
我只想要分隔符上面的线。我已经挣扎了太长时间,并尝试了一些变种。我的一句话是:
echo -e "foo\n-- \nbar" | gawk -v x=0 -- '/^--\ / { x++ } ; IF (x==0) {print} '
这应该只打印“foo”,但我得到了整个文件的输出。如果我改为打印x,我得到
0
1
1
我似乎无法使awk根据x的值有条件地打印一行。我知道我错过了一些简单的东西。尝试这样做:
echo -e "foo\n-- \nbar" | awk '/^--/{exit}1'
解释
是与当前行开头的字符串匹配的正则表达式/^--/
如果条件为真(前一个正则表达式),则执行部分{}
类似于1
:默认情况下,如果条件为真,{print}
在标准输出上打印。当awk的awk
为真时,它会打印当前行1
echo -e "foo\n-- \nbar" | awk '
{
if (/^--/) {
exit
}
else {
print
}
}
'
替代分解:
echo -e "foo\n-- \nbar" |
awk '(/^--/) { exit }
{ print }'
这强调了有两种模式作用规则;一个有明确的模式和退出动作;另一个是隐式模式和打印操作。您的原始脚本在正确的行上,但太复杂了:
echo -e "foo\n-- \nbar" | gawk '/^--\ / { x++ } { if (x==0) print}'
变量由awk
自动创建并归零(因此您不需要-vx=0
等)。“双破折号点”代码很好。分号是不必要的(充其量)。IF(x==0){print}的非常奇怪。Mac OS X 10.7.5上的awk
接受它,但我不确定它在做什么。替换操作针对每一行,并在打印前测试x
是否为零
就我个人而言,我可能会为此使用sed
:
将我的sed
命令修复为:
您可以使用his中显示的命令在awk
中模拟此操作
1匹配每一行(始终为true),并触发默认操作,即“print$0”。你也可以写:
echo -e "foo\n-- \nbar" | awk '/^--/ {exit} {print}'
如果您更喜欢sed
:
sed -n '/^--$/q;p' file.txt
说明:sed
逐行读取文件。如果sed发现模式^-$
(即,一行正好包含-
)它将退出(这是q
命令),否则,sed
将打印该行的内容(使用p
命令)。请注意,sed
是使用-n
选项启动的,即,除非使用p
命令明确指示,否则不会输出任何内容。由于当找到分隔符--
时(即在p
命令之前),sed
退出,因此不会打印此分隔符
sed
的优点是,对于此任务,它比awk
更快
编辑。正如格伦·杰克曼(glenn jackman)在评论中指出的,使用GNU sed,您可以使用:
sed '/^--$/Q' file.txt
(当我回答时,我不在一台有
sed
和Q
命令的计算机上)。谢谢glenn。在GNU awk中,您可以将记录分隔符设置为只包含“-”的行,然后只打印第一条记录:
$ gawk -v RS='\n--\n' 'NR==1' file
foo
或者,如果性能是一个问题:
$ gawk -v RS='\n--\n' 'NR==1{print;exit}' file
foo
这样,您可以在以后增强脚本以打印您可能需要的任何其他记录:
$ cat file
the
quick
--
brown
fox
--
jumped
$
$ gawk -v RS='\n--\n' 'NR==1' file
the
quick
$ gawk -v RS='\n--\n' 'NR==2' file
brown
fox
$ gawk -v RS='\n--\n' 'NR==3' file
jumped
晦涩是好的,但我需要先了解它。我喜欢退出,但那1是干什么用的?@gniourf\u gniourf:哦,是的……我想是的……你的……不……复制、抄袭、作弊……这是做同样的事情:“
sed'/^--$/Q'
--Q不打印退出。需要GNU支持。@glennjackman啊,你说得对!我没有与这里的版本相同的sed
,也没有在手册页中找到Q
命令。。。谢谢
$ gawk -v RS='\n--\n' 'NR==1' file
foo
$ gawk -v RS='\n--\n' 'NR==1{print;exit}' file
foo
$ cat file
the
quick
--
brown
fox
--
jumped
$
$ gawk -v RS='\n--\n' 'NR==1' file
the
quick
$ gawk -v RS='\n--\n' 'NR==2' file
brown
fox
$ gawk -v RS='\n--\n' 'NR==3' file
jumped