Bash
合併列中的重複行
給定這樣的文件:
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