ユニークなラインを見つける


90

一意の行を見つけて、ファイルからすべての重複を削除するにはどうすればよいですか?私の入力ファイルは

1
1
2
3
5
5
7
7

結果を次のようにしたいと思います。

2
3

sort file | uniq仕事をしません。すべての値が1回表示されます


17
ファイルを最初にソートする必要があります。sort file | uniq -uコンソールに出力されます。
ma77c 2015

sort file | uniqすべての値を1回表示する理由は、最初に遭遇した行をすぐに印刷し、その後の遭遇ではそれらをスキップするためだと思います。
Reeshabh Ranjan

回答:


88

uniq 必要なオプションがあります:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3

32
ファイル内のエントリがソートされていない場合は、必ずソートしてください。file.txtを並べ替える| uniq
user3885927 2016

最初に並べ替えをしたくない場合は、私の答えを参照してください。stackoverflow.com/a/54803217/5441945
hychou

28

次のように使用します。

sort < filea | uniq > fileb

2
これは正しくありません、あなたが意味したと思います:uniq -u filea > fileb
Chris Seymour

1
私はあなたのデータをコピーして実行し、それは機能します:sort<filea.txt | uniq>fileb.txt。多分あなたは拡張機能を省略しました。私はMacOS Xを使用しています。filea.txt他の場所に移動する必要がありますfileb.txt
kasavbere 2012

でリダイレクトする必要はありません。実行していることを実行できるsortようuniqになるまでのパイプのポイントはsort -u file -o file、重複する値を削除することです。つまり、OPがfileb含まれ1,2,3,5,7ている場合、ファイル拡張子2,3によって達成される一意の行のみが必要です。uniq -u fileそれに、あなたの答えは間違っています。
クリスシーモア

12

また、使用して、「ファイル」に一意の値をプリントアウトできcatに配管のコマンドをsortし、uniq

cat file | sort | uniq -u


9

uniq -uは、機能しなかったため、私を夢中にさせてきました。

したがって、その代わりに、Pythonを使用している場合(ほとんどのLinuxディストリビューションとサーバーにはすでにPythonがあります):

notUnique.txtにデータファイルがあると仮定します

#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のマニュアルページから:

「注:「uniq」は、隣接していない限り、繰り返される行を検出しません。最初に入力を並べ替えるか、「uniq」なしで「sort -u」を使用することをお勧めします。また、比較は「LC_COLLATE」で指定されたルールを尊重します。」

で呼び出す正しい方法の1つ:#sort nonUnique.txt | uniq

実行例:

$ 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

スペースが印刷される場合がありますので、ご用意ください。


3
これはやり過ぎです。
smallChess 2016

9

一方でsortO(Nログ(n))は時間がかかり、私が使用して好みます

awk '!seen[$0]++'

awk '!seen[$0]++'は、の省略形です。がゼロでないawk '!seen[$0]++ {print}'場合seen[$0]は、print line(= $ 0)。より多くのスペースが必要ですが、O(n)時間しかかかりません。


7

使用できます:

sort data.txt| uniq -u

このソートデータと一意の値によるフィルタリング



3

uniqファイルがソート可能である場合、または何らかの理由でファイルをソートできない場合は、次を使用できますawk

awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'


3
sort -d "file name" | uniq -u

これは私にとっても同様の問題でした。配置されていない場合に使用します。並べ替えがあれば削除できます



0

これは私が試した最初のものでした

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

猫をやった後-eall.sorted

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

1行おきに末尾のスペースがあります:(すべての末尾のスペースを削除した後、機能しました!

ありがとうございました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.