0

我正在 awk 中进行文件遍历。这方面的一个例子是

Dat time range column session - 1
time name place session animal - 2 
hi bye name things - 3

在这两者中。我需要逐行遍历,并且我需要在包含session.

因此,在这种情况下,我需要到达第 1 行和第 2 行,因为它包含单词 session 而不是第 3 行,因为它不包含该字段(从某种意义上说,我可以跳过这个)。从那里我需要逐字遍历以到达会话字段。

我知道$0可以代表整条线。但我的问题是到达线后如何逐字遍历。

你能帮我解决这个问题吗?谢谢你。

4

2 回答 2

1

$0您可以使用此构造循环遍历当前行:

for(i = 1; i <= NF; i++) print $i

这利用了预定义的 awk 变量NF,该变量代表当前行 ( $0) 上的字段数。

您可以在$i遍历该行时检查 的值,并根据该值确定如何处理该值。例如,打印、跳过等。if ($i == "session") ...

更新:

您还可以使用该match()函数来确定您正在处理的当前行是否包含“会话”字符串,而无需遍历该行。例如,

where = match($0, "session")
if (where > 0)
   print "Found session in this line";
else
   print "session not found in this line";

请注意,match()它将正则表达式作为第二个参数,因此您的匹配可能非常复杂。有关此函数和其他awk 字符串函数的更多信息,请参阅此页面。

于 2012-07-10T16:49:07.187 回答
1

您可以使用for循环,仅过滤包含“会话”的行:

awk '/session/{ for (i = 1; i <= NF; i++) { \
                  if ($i == "session") \
                    do_whatever_here \
                } \
              }'

您可以在此处阅读有关这些说明的更多信息:for字符串比较if.

于 2012-07-10T16:52:11.820 回答