順序を維持しながら隣接する重複行を削除する


11

それぞれが何回も繰り返される名前が1列のファイルがあります。同じ名前の他の繰り返しに隣接していない同じ名前の他の繰り返しを維持しながら、各繰り返しを1つに圧縮したい。

例えば、私は左側を右側に向けたいです:

Golgb1    Golgb1    
Golgb1    Akna
Golgb1    Spata20
Golgb1    Golgb1
Golgb1    Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna

これは私が使用してきたものです。perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt ただし、この方法では左から1つの代表のみが保持されます(つまり、Golb1とAknaは繰り返されません)。

複数の隣接しないブロックで繰り返される名前を維持しながら、各ブロックの一意の名前を維持する方法はありますか?

回答:


23

uniq あなたのためにこれを行います:

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna

2
なんて恥ずかしいほど簡単でした!ありがとう!
Age87

@ Age87 Unixは素晴らしいです!これは、重複がすでに隣接していると予想している(または、隣接していない重複を削除したくない)ためにのみ機能します。通常は、以下を使用することをお勧めしますsort | uniq
jpaugh

1
もっと簡潔にsort -u
言えば

9

Awk 解決:

awk '$1 != name{ print }{ name = $1 }' file.txt

出力:

Golgb1
Akna
Spata20
Golgb1
Akna

6

これを試してください-前の行を保存して現在の行と比較してください

$ perl -ne 'print if $p ne $_; $p=$_' ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

あなたもタグ付けしuniqました-試しましたか?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

1

sedを以下のようにそれを行うことができます。

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

ここでは、パターンスペースにいつでも2行あります。それらの間の比較が失敗した場合、最初の1つを印刷し、それを前からチョップし、戻って次の行をパターンスペースに追加します。すすぎ...繰り返し

活用Perlを私たちはあなたのための比較を行う正規表現が塗布された1つの長い文字列としてファイル全体を扱う吸い込みモードで。

perl -0777pe 's//$1/ while /^(.*\n)\1+/gm' input_file

0

Rakesh Sharmaのsedソリューションに関する質問。

次のような入力ファイルがあるとします。

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.118 48.216
-126.128 48.222
-126.136 48.226

そして、あなたは出力ファイルを次のようにしたいです:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.128 48.222
-126.136 48.226

不足していることに注意してください。

-126.118 48.216

私が欲しいコマンドはあなたの解決策に似ています:

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

正しい方法で変更して両方の列を印刷することはできず、この特別な方法で列2の値のみを使用して並べ替えることはできません。任意のヒント?


sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D' 後続の繰り返し要素を削除します。注:これにはが必要GNU sedです。POSIX動作については、わずかな変更が必要です。
Rakesh Sharma
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.