Bash

合併列中的重複行

  • December 29, 2015

給定這樣的文件:

x y y z x
x x y z z y
x x x z y
y z z y x x x
x x x x x

我希望輸出為:

x y+ z x
x+ y z+ y
x+ z y
y z+ y x+
x+

這可能與oneliner中的awk或perl有關嗎?即是否可以在行中找到任意數量的相似值並將它們合併?

perl版本還可以處理任意欄位長度,而不僅僅是單個字元的長度:

$ perl -lpae 'for $i (@F){s/($i\s*){2,}/$i+ /g}' file 
x y+ z x
x+ y z+ y
x+ z y
y z+ y x+ 
x+ 

在更複雜的文件上:

$ cat file
foo foo foo bar foo
bar foo bar bar foo
foo foo x x x bar
$ perl -lpae 'for $i (@F){s/($i\s*){2,}/$i+ /g}' file 
foo+ bar foo
bar foo bar+ foo
foo+ x+ bar

解釋

從每個輸入行-l修剪換行符,-a將空格上的輸入欄位拆分為數組@F,並-p在應用由-e.

腳本本身迭代每個輸入欄位(@F數組),將每個欄位保存為$i. 替換查找 2 個或多個連續$i後跟 0 個或多個空格並將它們替換為$i+.

sed 's/\(.\)\( \1\)\{1,\}/\1+/g' <in >out

x y+ z x
x+ y z+ y
x+ z y
y z+ y x+
x+

使用 BSD 或 GNU sed

sed -Ee's/(.)( \1)+/\1+/g' <in >out

要使用任意欄位長度,您只需使用任意欄位長度即可:

sed -Ee 's/(...)( \1)+/\1+/g' <<""
xxx yyy yyy zzz xxx
xxx xxx yyy zzz zzz yyy
xxx xxx xxx zzz yyy
yyy zzz zzz yyy xxx xxx xxx
xxx xxx xxx xxx xxx

xxx yyy+ zzz xxx
xxx+ yyy zzz+ yyy
xxx+ zzz yyy
yyy zzz+ yyy xxx+
xxx+

或者在第二行稍微修改@terdon 的輸入:

sed -Ee's/(([^ ]+ *)+)( +\1)+/<\1>+/g' <<""
foo foo foo bar foo
bar foo bar foo
foo foo x x x bar

<foo>+ bar foo
<bar foo>+
<foo>+ <x>+ bar

引用自:https://unix.stackexchange.com/questions/252105