2017-10-04 59 views
0

我已經想出瞭如何用awk做到這一點,但我想找到一種方法來用sed來做到這一點。我在StackOverflow上看到的使用awk或者是非常神祕,不起作用,並且不提供任何解釋來幫助我使其工作。我有這樣的輸入:加入與sed共同字段的專用字段?

Hello1 AAA

Hello2 BBB

Hello1 CCC

Hello1 DDD

而且需要這樣的輸出:

Hello1 AAA,CCC,DDD

Hello2 bbb

如果你可以解釋命令,那就太棒了。我試着讀sed,但它仍然很混亂。

回答

0

我見過的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 
+0

我知道如何用awk做到這一點,我在sed中要求一個等效的命令。 – Ashley

+0

@Ashley:對不起,可能是我誤讀了,AFAIK你要求解釋也 –

+0

@Ashley這將是很好,如果你還可以顯示你的SED實驗,我個人感興趣,知道如何做到這一點 –

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並打印它的內容。