2017-10-04 8 views
0

私はawkでこれを行う方法を理解しましたが、sedでもそれを行う方法を見つけたいと思います。私がStackOverflowで見たことは、awkを使用するか、または非常に潜在的であり、動作しないし、動作させるための説明を提供しません。sedと共通のフィールドを持つ行に結合しますか?

Hello1のCCC

Hello1 DDD

BBB

Hello1のAAA

Hello2そして、このような出力必要があります:私はこのような入力を持って

Hello1のAAA、CCC、DDDを

Hello2 bbb

あなたがこのコマンドを説明できるなら、それは素晴らしいでしょう。私はsedで読んでみましたが、それはまだ非常に混乱しています。私はStackOverflowのいずれかで見たことは何

答えて

0

は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への最後の行であり、内容を印刷する場合です。

関連する問題