2013-07-01 8 views
6

thisの解決策を探すために2時間を試しました。明らかに、残念ながら私は成功しなかった。本当にトリッキーな質問です。 (AWK質問から) 純粋なsedを用いたカラムの複雑な転位


例:

  • 入力:
 
aaa 111  
aaa 222 
aaa 333 
bbb 444 
bbb 555 
ccc 666 
  • 出力:
 
aaa 111,222,333 
bbb 444,555 
ccc 666 

  • 入力
 
APM00065101435 189 
APM00065101435 190 
APM00065101435 191 
APM00065101435 390 
190104555 00C7 
190104555 00D1 
190104555 00E1 
190104555 0454 
190104555 0462 
APM00065101435 391 
APM00065101435 392 
  • 出力
 
APM00065101435 189,190,191,390 
190104555 00C7,00D1,00E1,0454,0462 
APM00065101435 391,392 

私が試してみましたか?私以外の作業のいくつかの例:これを読むため

 
sed -nr '1{h;b};H;x;/(\S+).*\n\1.*\'/M{x;b};s/.*\'//m;s/\n\S*\s*/,/g;s/,$//;p' file 
sed -nr '1{h;b};H;x;h;s/(\S+).*\n(\S+).*\'/\1\n\2/m;/(\S+)\n\1\'/M{$!b;g;bk};g;s/\n.*\'//m;:k;s/^\S+\s//2mg;s/\n/,/g;p;x;s/.*\n//;h;$l' file2 
sed -nr 'H;g;s/(\S+)\s.*/\1/gm;/(\S+)\n\1\'/M{$!b;g;bk};g;1d;s/\n.*\'//m;:k;s/\n\S+\s/,/2g;s/\n//;p;g;s/\n.*(\n.*)$/\1/;h' file2 

感謝。

+0

うん...これは可能かもしれない...しかし、私は確かに私の時間を無駄にしようとしないでしょうか?なぜあなたは純粋なsedソリューションを望んでいますか?この問題はawkのためのスナップです...あなた自身の人生をもっと難しくするのはなぜですか? –

+0

これを 'awk'や' perl'で解決すると読みやすくメンテナンスが容易になり、ユニコーンを夢見るでしょう!!ユニコーンの男のためにちょうどそれをしてください(または[potong](http://stackoverflow.com/users/967492/potong)が目を覚ますまで待ってください)!! –

答えて

5

これは(GNUのSED)あなたのために働くかもしれない:

sed -r ':a;$!N;s/^(([^ ]+).*)\n\2/\1,/;ta;P;D' file 

またはあなたが好む場合:

sed -r ':a;$!N;s/^((\S+\s).*)\n\2/\1,/;ta;P;D' file 

これは、パターンスペースに2行を読み込み、各行の先頭を比較それらが同じ場合は、最初に一致する2行目の先頭をカンマで繰り返して繰り返します。行が一致しない場合は、最初の行が出力されます。

+0

ありがとう、potong。あなたは私をもう一度助けました。私はあなたに非常に義務づけられています、ありがとう。もしできれば、私はあなたに恩恵を払うだろう! – captcha

関連する問題