使用awk在条件上打印特定列

时间:2016-12-29 07:21:27

标签: linux bash unix awk

我修改了iostat -e的输出,如下所示:

iostat -e | egrep -v  "errors|trn" | gawk -v name="`uname -n `" '{if($2 > 0 || $3 > 0) print name,$1}' | tr '\n' ' '  ' > ~/abd/diskcheck.out

我想在下一列中打印第二列的值,其中使用Linux命令重复第一列的值。

我的示例文件是:

$ cat diskcheck.out                                               
hxcsvc-a02 sd2
hxcslc-a01 sd23
hxcslc-a02 sd14
hxcslc-a02 sd17
hxcslc-a02 sd18
hxcslc-a02 sd19
hxcslc-a03 sd11
hxcslc-a07 sd3
hxcslc-a09 sd2

预期产出:

hxcsvc-a02 sd2
hxcslc-a01 sd23
hxcslc-a02 sd14 sd17 sd18 sd19
hxcslc-a03 sd11
hxcslc-a07 sd3
hxcslc-a09 sd2

1 个答案:

答案 0 :(得分:1)

以更简单的方式使用awk

awk 'BEGIN{delete hash;}{hash[$1]=hash[$1]FS$2}END{for (i in hash) print i, hash[i]}' file
hxcslc-a07  sd3
hxcslc-a09  sd2
hxcsvc-a02  sd2
hxcslc-a01  sd23
hxcslc-a02  sd14 sd17 sd18 sd19
hxcslc-a03  sd11

其中file是您的输入文件

$ cat file                                               
hxcsvc-a02 sd2
hxcslc-a01 sd23
hxcslc-a02 sd14
hxcslc-a02 sd17
hxcslc-a02 sd18
hxcslc-a02 sd19
hxcslc-a03 sd11
hxcslc-a07 sd3
hxcslc-a09 sd2

我会尝试分解答案,因为你刚刚使用它,

  • 通常,awk一次处理一行,并且语法为awk 'BEGIN{..}{..}END{..}',其中BEGINEND中的指令在文件完成之前和之后执行按相应顺序处理。
  • 您的所有列均以空格分隔,awk默认情况下仅通过此限制器拆分输入记录。您可以根据需要更改此值并输出字段分隔,分别使用FSOFS变量。
  • 在您的情况下,根据要求构建一个哈希表,其中$1(这意味着第一列用空格分隔)作为索引,值为$2。将每个唯一键的值附加到已存在的值。
  • 处理完所有行后,在END循环中,打印唯一索引及其值。

如果要使用其他命令在管道中运行上述命令,请尝试使用

<your-previous-command> | awk 'BEGIN{delete hash;}{hash[$1]=hash[$1]FS$2}END{for (i in hash) print i, hash[i]}'

有关其用法的更详细说明,请推荐一些Awk tutorials