我已经弄清楚如何用awk做这件事,但我也想找到一种方法来用sed做到这一点。我在StackOverflow上看到的要么使用awk,要么非常神秘,不起作用,并且没有提供任何解释来帮助我使其工作。我有这样的输入:
Hello1 aaa
Hello2 bbb
Hello1 ccc
Hello1 ddd
需要这样的输出:
Hello1 aaa,ccc,ddd
Hello2 bbb
如果你能解释这个命令,那就太棒了。我已经尝试过阅读sed,但它仍然非常令人困惑。
答案 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