各列の名前が複数回繰り返される列を持つファイルがあります。同じ名前の異なる反復と隣接していない同じ名前の異なる反復を維持しながら、各反復を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の値のみを並べ替えることができます。どのようなヒントがありますか?