Apakah ada alat yang bisa mendapatkan baris yang berisi file A, tetapi file B tidak? Saya bisa membuat skrip sederhana dengan, misalnya, Perl, tetapi jika hal seperti itu sudah ada, saya akan menghemat waktu saya mulai sekarang.
Jawaban yang Diterima:
Ya. grep
standard standar alat untuk mencari file untuk string teks dapat digunakan untuk mengurangi semua baris dalam satu file dari yang lain.
grep -F -x -v -f fileB fileA
Ini bekerja dengan menggunakan setiap baris dalam fileB sebagai pola (-f fileB
) dan memperlakukannya sebagai string biasa untuk dicocokkan (bukan regex biasa) (-F
). Anda memaksa kecocokan terjadi di seluruh baris (-x
) dan cetak hanya baris yang tidak cocok (-v
). Oleh karena itu, Anda mencetak baris di fileA yang tidak berisi data yang sama dengan baris mana pun di fileB.
Kelemahan dari solusi ini adalah tidak memperhitungkan urutan baris dan jika input Anda memiliki baris duplikat di tempat yang berbeda, Anda mungkin tidak mendapatkan apa yang Anda harapkan. Solusinya adalah dengan menggunakan alat perbandingan nyata seperti diff
. Anda dapat melakukan ini dengan membuat file diff dengan nilai konteks pada 100% dari baris dalam file, lalu menguraikannya hanya untuk baris yang akan dihapus jika mengonversi file A ke file B. (Perhatikan juga perintah ini menghapus pemformatan diff setelah mendapatkan baris yang benar.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC