it-swarm-tr.com

Verileri sıralamak zorunda kalmadan yalnızca benzersiz sonuçlar nasıl elde edilir?

$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

İhtiyacım olan sonuç orijinal dosyadaki tüm satırları tüm kopyaları kaldırarak (yalnızca ardışık olanları değil), dosyadaki ifadelerin orijinal sırasını korurken görüntülemek.

Bu örnekte, aslında aradığım sonuç şuydu:

aaaaaa
cccccc
bbbbbb

Bu genelleştirilmiş uniq işlemini genel olarak nasıl yapabilirim?

43
Lazer
Perl -ne 'print unless $seen{$_}++' data.txt

Veya cat kullanışsız bir şekilde kullanmanız gerekiyorsa:

cat data.txt | Perl -ne 'print unless $seen{$_}++'

Perl içermeyen sistemler için bir awk çeviri:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
57
cjm

johnunique adlı bir araca sahip:

[email protected] % cat data.txt | unique out
[email protected] % cat out
aaaaaa
cccccc
bbbbbb

Tek bir komut satırında ek araçlar olmadan aynı şeyi başarmak biraz daha karmaşıktır:

[email protected] % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl satır numaralarını satırların önüne yazdırır, bu yüzden onların arkasında sort/uniq olursa, satırların orijinal sırasını geri yükleyebiliriz. sed daha sonra sadece satır numaralarını siler;)

13
binfalse

Bunu kullanmayı tercih ediyorum:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n satır numaraları ekler,

sort --key=2.1 -b -u ikinci alanda sıralar (eklenen satır numaralarından sonra), önde gelen boşlukları yok sayarak, benzersiz satırları koruyarak

sort -n katı sayısal sırayla sıralar

cut -c8- sütun 8'den EOL'ye kadar olan tüm karakterleri sakla (yani, dahil ettiğimiz satır numaralarını atla)

6
menkus

Perl'de kullanabileceğiniz, uniq adlı bir işlev içeren bir modül vardır. Bu nedenle Perl'de bir diziye yüklenen verilerinizi kurtarırsanız, benzersiz hale getirmek için yine de böyle bir işlevi çağırırsınız, ancak yine de orijinal düzeni korursunuz.

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Bu modül hakkında daha fazla bilgiyi buradan edinebilirsiniz: Liste :: MoreUtils

2
slm