1

我在awk中有以下句子

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

我想知道这条指令到底做了什么,因为我无法准确解析我需要的单词。

编辑:我该怎么做才能跳过以下星号之前的行?假设我有以下几行:

text
text
text                


            * * * * * * *

line1 - 
line2 -

然后我只想过滤

line1
line2

用我上面贴的那句话...

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

感谢您的时间和回复!

4

2 回答 2

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 }
            }'
于 2013-08-21T01:55:07.493 回答
1

回答原来的问题:

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

这将匹配并打印出来one

one - two three

这不会:

one two three four

回答修改后的问题:

此代码应该在给定字符串匹配执行您需要的操作:

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

对此数据的测试给出以下输出:

2two
2two
于 2013-08-21T01:57:43.540 回答