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

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

各列の名前が複数回繰り返される列を持つファイルがあります。同じ名前の異なる反復と隣接していない同じ名前の異なる反復を維持しながら、各反復を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は重複しません)。

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

答え1

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

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna

答え2

Awk解決策:

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

出力:

Golgb1
Akna
Spata20
Golgb1
Akna

答え3

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

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

uniqまたタグ付け - 試してみましたか?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

答え4

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つの列を印刷するには、正しい方法で変更する方法はありません。この特別な方法では、列2の値のみを並べ替えることができます。どのようなヒントがありますか?

関連情報