2013-07-01 69 views
6

我試了幾個小時才找到this問題的解決方案。顯然,不幸的是我沒有成功。一個非常棘手的問題。 與純sed色譜柱複雜轉座


實例(從AWK問題):

  • 輸入:
 
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號線到模式空間,每一行的開頭比較如果它們是相同的,用逗號代替第一行的開頭,然後重複。如果行不匹配,則打印出第一行。

+0

非常感謝,波東。你再次幫助我。我非常感謝你,謝謝。如果可以的話,我會付給你一筆賞金! – captcha