perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
Veri yapıları:
- Hash
%h
Anahtarları ilk alanlar (AAA BBB, CCC, vb) ve karşılık gelen değerleri tuşları karşılaşıldı sırayı anlatan sayılardır. Böylece, örneğin, AAA => 0 tuşu, BBB => 1 tuşu, CCC => 2 tuşu.
@h
Öğeleri baskı sırasında yer alan çizgiler olan dizi . Verilerde hem true hem de false bulunursa, false değeri diziye girer. OTW, bir tür veri varsa, o zaman bu mevcut olurdu.
Başka bir yol GNU sed kullanmaktır:
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
FWIW, yukarıdaki GNU-sed kodu için POSIX eşdeğer kodu aşağıda listelenmiştir:
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
açıklama
- Bu yöntemde nihayet yazdırılacak sonucu bekletme alanında saklarız.
- Okunan her satır için, mevcut alanın mevcut tutma alanı karşısında incelenmesi için tutma alanını desen alanına ekleriz.
- Şimdi bu karşılaştırma sırasında 5 şey olabilir:
- a) Geçerli satır, bekletme satırındaki bir yerde eşleşir & false: false.
- [ACTION] Aynı yanlış durum bulunduğundan, hiçbir şey yapmayın.
- b) Geçerli satır, bekletme satırındaki bir yerde eşleşir & true: true.
- [ACTION] Aynı gerçek durum bulunduğundan, hiçbir şey yapmayın.
- c) Geçerli satır, bekletme satırındaki bir yerde eşleşiyor & true: false.
- [EYLEM] Yanlış bir durum zaten mevcut olduğundan hiçbir şey yapmayın.
- d) Geçerli satır, bekletme satırındaki bir yerde eşleşir & false: true.
- [EYLEM] Bu, bazı çalışmayı içerir, çünkü yanlış satırı, doğrunun bulunduğu konumla aynı konumda değiştirmemiz gerekir.
- e) Geçerli hat, bekletme hattının hiçbir yerinde eşleşmiyor.
- [EYLEM] Mevcut satırı sonuna kadar taşıyın.
Sonuçlar
AA,false
BB,false
CC,false
DD,true
true
ilk sütunun ilk örneğiyse sakla ?