Menggunakan beberapa utilitas yang kurang dikenal:
sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Ini akan menampilkan duplikat, jadi jika ada 1 3
di file1
, tapi 2 di file2
, ini masih akan menampilkan 1 3
. Jika ini bukan yang Anda inginkan, salurkan output dari sort
melalui uniq
sebelum menulisnya ke file:
sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Ada banyak utilitas dalam paket GNU coreutils yang memungkinkan semua jenis manipulasi teks.
$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7
Penjelasan tentang cara kerja kode:
- Jika kita sedang mengerjakan file1, lacak setiap baris teks yang kita lihat.
- Jika kita sedang mengerjakan file2, dan belum melihat teks baris, maka cetaklah.
Penjelasan detail:
FNR
adalah nomor catatan file saat iniNR
adalah jumlah rekor keseluruhan saat ini dari semua file masukanFNR==NR
benar hanya ketika kita membaca file1$0
adalah baris teks saat inia[$0]
adalah hash dengan kunci yang disetel ke baris teks saat inia[$0]++
trek yang telah kita lihat pada baris teks saat ini!($0 in a)
benar hanya jika kita belum melihat teks baris- Cetak baris teks jika pola di atas mengembalikan true, ini adalah perilaku awk default saat tidak ada tindakan eksplisit yang diberikan