一意の行を見つけて、ファイルからすべての重複を削除するにはどうすればよいですか?私の入力ファイルは
1
1
2
3
5
5
7
7
結果を次のようにしたいと思います。
2
3
sort file | uniq
は仕事をしません。すべての値を1回表示します
uniq
には必要なオプションがあります:
-u, --unique
only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
次のように使用します。
sort < filea | uniq > fileb
uniq -uは機能しなかったので、私を夢中にさせていました。
その代わりに、pythonがある場合(ほとんどのLinuxディストリビューションとサーバーには既にあります):
#Python
#Assuming file has data on different lines
#Otherwise fix split() accordingly.
uniqueData = []
fileData = open('notUnique.txt').read().split('\n')
for i in fileData:
if i.strip()!='':
uniqueData.append(i)
print uniqueData
###Another option (less keystrokes):
set(open('notUnique.txt').read().split('\n'))
ちなみに、uniq Manページから:
「注: 'uniq'は、隣接していない限り、繰り返される行を検出しません。最初に入力をソートするか、 'uniq'なしで 'sort -u'を使用します。
正しい方法の1つで、次を使用して呼び出します。#sort nonUnique.txt |ユニーク
$ cat x
3
1
2
2
2
3
1
3
$ uniq x
3
1
2
3
1
3
$ uniq -u x
3
1
3
1
3
$ sort x | uniq
1
2
3
cat
およびsort
にパイピングすることにより、uniq
コマンドを使用して「ファイル」内の一意の値を出力することもできます。
cat file | sort | uniq -u
uniq -u < file
が仕事をします。
sort
はO(n log(n))時間かかりますが、
awk '!seen[$0]++'
awk '!seen[$0]++'
はawk '!seen[$0]++ {print}'
の略語で、seen[$0]
がゼロでない場合にline(= $ 0)を出力します。より多くのスペースが必要ですが、O(n)時間しかかかりません。
uniq
は、ファイルがソートされている場合、またはソートできる場合は問題ありません。何らかの理由でファイルをソートできない場合は、awk
を使用できます。
awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'
使用できます:
sort data.txt| uniq -u
この並べ替えデータと一意の値によるフィルタリング
sort -d "file name" | uniq -u
これは私のために同様のもののために働いた。配置されていない場合に使用します。並べ替えられている場合は、並べ替えを削除できます
これは私が最初に試した
skilla:~# uniq -u all.sorted
76679787
76679787
76794979
76794979
76869286
76869286
......
猫をやった後-e all.sorted
skilla:~# cat -e all.sorted
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $
2行ごとに末尾スペースがあります:(すべての末尾スペースを削除した後、機能しました!
ありがとうございました