我已經想出瞭如何用awk做到這一點,但我想找到一種方法來用sed來做到這一點。我在StackOverflow上看到的使用awk或者是非常神祕,不起作用,並且不提供任何解釋來幫助我使其工作。我有這樣的輸入:加入與sed共同字段的專用字段?
Hello1 AAA
Hello2 BBB
Hello1 CCC
Hello1 DDD
而且需要這樣的輸出:
Hello1 AAA,CCC,DDD
Hello2 bbb
如果你可以解釋命令,那就太棒了。我試着讀sed,但它仍然很混亂。
我已經想出瞭如何用awk做到這一點,但我想找到一種方法來用sed來做到這一點。我在StackOverflow上看到的使用awk或者是非常神祕,不起作用,並且不提供任何解釋來幫助我使其工作。我有這樣的輸入:加入與sed共同字段的專用字段?
Hello1 AAA
Hello2 BBB
Hello1 CCC
Hello1 DDD
而且需要這樣的輸出:
Hello1 AAA,CCC,DDD
Hello2 bbb
如果你可以解釋命令,那就太棒了。我試着讀sed,但它仍然很混亂。
我見過的StackOverflow上無論是什麼樣的用途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
這可能爲你工作(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並打印它的內容。
我知道如何用awk做到這一點,我在sed中要求一個等效的命令。 – Ashley
@Ashley:對不起,可能是我誤讀了,AFAIK你要求解釋也 –
@Ashley這將是很好,如果你還可以顯示你的SED實驗,我個人感興趣,知道如何做到這一點 –