这个awk句子是什么意思?

时间:2013-08-21 01:51:26

标签: regex linux unix awk

我在awk中有以下句子

$ gawk '$2 == "-"  { print $1 }' file

我想知道这条指令究竟做了什么,因为我无法解析我需要的字。

编辑:如何在以下astersiks之前跳过这些行? 假设我有以下几行:

text
text
text                


            * * * * * * *

line1 - 
line2 -

然后我想过滤

line1
line2

上面张贴的句子......

$ gawk '$2 == "-"  { print $1 }' file

感谢您的时间和回应!

2 个答案:

答案 0 :(得分:3)

这将找到第二列(以空格分隔)为 - 的所有行,然后将打印第一列。

第一部分($ 2 ==“ - ”)检查第二列是否为 - ,如果是这种情况,则运行附加的{}块,打印第一列($ 0为整行,和$ 1,$ 2等是第一,第二......列。)

空格是这里的分隔符,因为它们是awk中的默认分隔符。

编辑:要做你现在想做的事,试试下面的内容(不是最优雅,但它应该有用。)

gawk 'BEGIN { p = 0 } { if (p != 0 && $2 == "-") { print $1 } else { p = ($0 == "* * * * * * *")? 1 : 0 } }'

为了清楚地了解正在发生的事情而传播更多行:

gawk 'BEGIN { p = 0 }
            { if (p != 0 && $2 == "-")
                 { print $1 }
              else
                 { p = ($0 == "* * * * * * *")? 1 : 0 }
            }'

答案 1 :(得分:1)

回答原始问题:

如果文件中一行中的第二列与字符串“ - ”匹配,则它会打印出该行的第一列,默认情况下,列以空格分隔。

这将匹配并打印出one

one - two three

这不会:

one two three four

回答修订后的问题:

此代码应该在匹配给定字符串之后执行

awk '/\* \* \* \* \* \* \*/{i++}i && $2 == "-" { print $1 }' data2.txt

this data上进行测试会得到以下结果:

2two
2two