2016-12-29 82 views
-3

我已修改的iostat -e输出这样一个条件打印的特定列Linux命令。使用AWK

我的样本文件:

$ 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 
+2

因为你是新来的,所以请仔细阅读[如何提出一个好问题?] – Inian

+0

是的,我是一个新手。请帮我解决上述问题。非常感谢 – user7352907

+2

SO不是一个编码服务!你应该让我们知道你的代码,你试过了什么,以及你失败了。 – Inian

回答

1

使用awkfile是输入文件

一个更简单的方法

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 

$ 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

+1

BEGIN部分没有做任何有用的事情,你可以删除它。 –