2010-04-08 37 views
13

İlk alan bir kopya ise çıktılardan çıktıları kaldırmak için bir awk (veya sed) tek liner arıyorsunuz.Alan yineleniyorsa çizgiyi kaldırın

gördüğüm yinelenen satırları kaldırmak için bir örnek:

awk 'a !~ $0; {a=$0}' 

hiçbir şans ile temeli için kullanmaya çalıştı (ben hile yapacağını $ 1'ler için $ 0'lar değişen ama düşünce işe yaramadı).

+0

boşluk yerine bir virgül olduğunu varsayar ... ne? 'Önceki bazı giriş satırlarındaki ilk alanla aynı değeri aldım'; Başka bir kişi 'belirli bir desen' aldı. Neyi planladın? –

+0

Değiştirilen sürümünüz 'awk 'a! ~ $ 1; {a = $ 1} ''* bitişik çiftler için (örneğin, sıralanmış bir dosya) benim için * çalışıyor. ** Jonathan Leffler'ın ** sürümü, bir çoğaltılmamış dosyadaki kopyaları kaldırmak için çalışacak, ancak potansiyel olarak büyük bir dizi oluşturma pahasına sahip olma avantajına sahiptir. –

+0

Asıl sorunum, birkaç farklı alan ayırıcıyla uğraştığımı ve FS'yi doğru tanımlayamadığımdı. – Kyle

cevap

25
awk '{ if (a[$1]++ == 0) print $0; }' "[email protected]" 

Bu, ilişkisel diziler için standart (çok basit) bir kullanımdır.

perl -ane 'print if ! $a{$F[0]}++' file 

başlayan dizine @F dizi konusunda çizgiyi autosplits:

+0

Bu işe yaradı! Benim de problemlerimi bana vermiş olabileceğimi fark etmediğim başka bir hata vardı. Teşekkürler! – Kyle

8

bu Perl kullanarak açıksan çiftleri

awk '!_[$1]++' file 
+2

Dizi adı olarak '_' kullanılması yanlış anlaşılmayı davet ediyor - ancak çalışıyor. –

1

nasıl kaldırılacağını olduğunu %a hash, ilk alanın daha önce

göründüğünü hatırlar 10

Bu kapsamdaki çözüm 'ilk alan maçları ise' saha ayırıcı yerine Sen çizgileri kaldırmak istedi

perl -F, -ane 'print if ! $a{$F[0]}++' file 
İlgili konular