使用sed特定的字段加入行?

时间:2017-10-04 17:57:56

标签: unix awk sed

我已经弄清楚如何用awk做这件事,但我也想找到一种方法来用sed做到这一点。我在StackOverflow上看到的要么使用awk,要么非常神秘,不起作用,并且没有提供任何解释来帮助我使其工作。我有这样的输入:

Hello1 aaa

Hello2 bbb

Hello1 ccc

Hello1 ddd

需要这样的输出:

Hello1 aaa,ccc,ddd

Hello2 bbb

如果你能解释这个命令,那就太棒了。我已经尝试过阅读sed,但它仍然非常令人困惑。

2 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed -r '1h;1d;H;x;s/((\S+) \S+)(.*)\n\2 (\S+)$/\1,\4\3/;x;$!d;x' file

将第一行存储在保留空间(HS)中,然后将其删除。对于后续行,将当前行附加到HS,并在交换到HS后,在类似值上匹配模式,并以所需格式替换(如果成功)值。始终交换回模式空间(PS),然后删除PS。最后,如果这是最后一行交换到HS并打印它的内容。

答案 1 :(得分:0)

  

我在StackOverflow上看到的要么使用awk,要么使用awk   神秘,不起作用,并没有提供任何解释来帮助我   让它发挥作用。

     

如果你能解释这个命令,那就太棒了。我试过了   阅读sed,但它仍然非常令人困惑。

awk '{arr[$1] = ($1 in  arr ? arr[$1] "," : "") $2 }END{ for(i in arr)print i,arr[i] }' infile

<强>解释

 awk '{
        # arr is array, index being first field
        # if array arr has key before ($1 in arr), then
        # arr[$1] contains previously stored value arr[$1] plus comma
        # and send field of line read
        # otherwise, just second field of line read

        arr[$1] = ($1 in  arr ? arr[$1] "," : "") $2 
      }
   END{ 
        # loop through array arr
        # print array key and value
        for(i in arr)print i,arr[i] 
      }
     ' infile

测试结果:

$ cat infile
Hello1 aaa
Hello2 bbb
Hello1 ccc
Hello1 ddd

$ awk '{arr[$1] = ($1 in  arr ? arr[$1] "," : "") $2 }END{ for(i in arr)print i,arr[i] }' infile
Hello1 aaa,ccc,ddd
Hello2 bbb
相关问题