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