用AWK加入每两行

时间:2012-12-14 03:46:37

标签: awk

以下命令不从奇数行中选择第二个字符串,从奇数偶数行中选择第4个字符串。 show_statistic.sh | grep -A 1 vlan | awk '{ if ( ( NR % 2 ) == 1 ) { print $2 } else { print $4 } }'
它打印每一行的第二和第四个字符串。我做错了什么?

2 个答案:

答案 0 :(得分:2)

看起来您的预期结果来自包含" vlan"以及以下几个。

您的代码将使用唯一的响应,但响应比一个响应更多,您的不同结果将被分开bi bi line onlyig only" - "如grep中所述:

  -A NUM
      Places  a  line  containing  a  group  separator  (--)   between
      contiguous  groups  of  matches.  With the -o or --only-matching
      option, this has no effect and a warning is given.

因此,对于这一行,您将需要第1,4,7行的第二个参数... 而第2,第5,第8行的第四个......

所以你的代码可以是:

show_statistic.sh | grep -A 1 vlan | awk '{  if ( ( NR % 3 ) == 1 ) { print $2 } else { if ( NR % 3 == 2 ) { print $4 } } }'

我写了一个小文本文件来测试:

1line here
2foo
vlan 2a 3a 4a 5a
1 2 3 4 5
bar

line here
vlan 2a 3a 4a 5a
1 2 3 4 5
line here
baz

结果是:

$ grep -A 1 vlan file| awk '{  if ( ( NR % 3 ) == 1 ) { print $2 } else { if ( NR % 3 == 2 ) { print $4 } } }'
2a
4
2a
4

答案 1 :(得分:2)

如果shell命令的输出遵循@Pierre-LouisLaffont创建的示例文件的布局,那么这是您应该使用的完整命令:

$ awk 'f{print $4;f=0} /vlan/{print $2;f=1}' file
2a
4
2a
4

当if找到vlan时,它打印第二个字段并设置一个标志,表示找到了vlan。在下一行,它打印第4个字段并重置标志。可能不会简单得多。