我在awk中有以下句子
$ gawk '$2 == "-" { print $1 }' file
我想知道这条指令究竟做了什么,因为我无法解析我需要的字。
编辑:如何在以下astersiks之前跳过这些行? 假设我有以下几行:
text
text
text
* * * * * * *
line1 -
line2 -
然后我想过滤
line1
line2
上面张贴的句子......
$ gawk '$2 == "-" { print $1 }' file
感谢您的时间和回应!
答案 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