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
Struktur data:
- Hash
%h
yang kuncinya adalah bidang pertama (AAA, BBB, CCC, dll.) Dan nilai yang sesuai adalah angka yang memberi tahu urutan kemunculan kunci tersebut. Jadi, misalnya, kunci AAA => 0, kunci BBB => 1, kunci CCC => 2.
- Array
@h
yang elemen-elemennya adalah garis-garis yang terdapat dalam urutan pencetakan. Jadi jika benar dan salah ditemukan dalam data, maka nilai palsu akan masuk ke array. OTW, jika ada satu jenis data, maka itu akan hadir.
Cara lain menggunakan sed GNU:
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, kode setara POSIX untuk kode sed GNU di atas tercantum di bawah ini:
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
Penjelasan
- Dalam metode ini kami menyimpan hasilnya untuk akhirnya dicetak di ruang penahanan.
- Untuk setiap baris yang dibaca, kami menambahkan ruang pegang ke ruang pola untuk pemeriksaan garis saat ini berhadapan dengan keadaan ruang pegang yang ada.
- Sekarang 5 hal yang mungkin terjadi selama perbandingan ini:
- a) Baris saat ini cocok dengan suatu tempat di baris tahan & false: false.
- [AKSI] Karena keadaan salah yang sama ditemukan, maka jangan lakukan apa pun.
- b) Baris saat ini cocok dengan suatu tempat di baris terus & true: true.
- [AKSI] Karena keadaan sebenarnya yang sama ditemukan, maka jangan lakukan apa pun.
- c) Baris saat ini cocok dengan suatu tempat di baris tahan & true: false.
- [AKSI] Karena keadaan palsu sudah ada, jangan lakukan apa pun.
- d) Baris saat ini cocok di suatu tempat di baris tahan & false: true.
- [AKSI] Ini melibatkan beberapa pekerjaan, di mana kita perlu mengganti garis palsu pada posisi yang sama persis di mana yang benar berada.
- e) Baris saat ini TIDAK cocok dengan di mana pun di baris terus.
- [AKSI] Pindahkan garis sekarang ke ujung.
Hasil
AA,false
BB,false
CC,false
DD,true
true
jika itu contoh pertama dari kolom pertama?