Saya mendapat dua file: file1 dengan sekitar 10.000 baris dan file2 dengan beberapa ratus baris. Saya ingin memeriksa apakah semua baris file2 terjadi di file1. Yaitu: ∀ baris ℓ ∈ file2: ℓ ∈ file1
Jika ada yang tidak tahu apa arti simbol-simbol ini atau apa yang "memeriksa apakah semua baris file2 terjadi di file1" berarti: Beberapa baris yang setara dalam file mana pun tidak memengaruhi apakah cek mengembalikan apakah file memenuhi persyaratan atau tidak.
Bagaimana saya melakukan ini?
text-processing
UTF-8
sumber
sumber
file2
berisi 2 barisA
, apakah Anda perlufile1
memuat minimal 2 barisA
?Jawaban:
Perintah ini akan menampilkan baris unik ke
file_2
. Jadi, jika output kosong, maka semuafile_2
baris terkandung dalamfile_1
.Dari kom pria:
sumber
-u
opsi ditambahkan kesort
perintah. Sekarang, hanya baris unik yang tersisa di kedua file yang diurutkan.<
pipa menjadi stdin. Apakah istilah braket mengubah ini?file_1
dalam bentuk yang sudah ditentukan. Menghemat pengetikan dan waktu.Jika jumlah kecocokan dari file2 di (baris unik) file1 sama dengan jumlah baris unik di file2, maka semuanya ada di sana; kalau tidak, mereka tidak.
sumber
Menggunakan GNU di
awk
mana ia mendukunglength(array)
fitur spesifik (dan beberapaawk
implementasi lain yang dapat mendukung) dan tidak diperlukan jika file diurutkan.Ini membaca file2 ke dalam array yang disebut
seen
dengan kunci sebagai seluruh baris file2 .Lalu baca file1 dan untuk setiap baris jika cocok dengan garis dalam array yang terlihat kemudian hapus kunci itu.
Pada akhirnya jika array kosong berarti semua baris dalam file2 ada di file1 dan akan dicetak
Matched
, jika tidak akan ditampilkanNot Matched
.Untuk kompatibilitas di semua
awk
implementasi.Untuk mengabaikan baris kosong / atau baris dengan spasi putih hanya jika dalam file2 , Anda perlu menambahkan
NF
ke kondisi diNR==FNR && NF {...
untuk melewati membacanya ke dalam array.sumber
length(array)
adalah AFAIK khusus gawk; pasti bukan POSIX.Menggunakan
comm
Anda dapat menemukan garis yang umum di kedua file.Lihat
man comm
untuk lebih jelasnyasumber
comm
- bandingkan dua file yang disortir baris demi baris".comm
berisi solusi yang jelas tidak salah. Ketika saya menjalankan perintah Anda, saya mendapat peringatan bahwa file tidak dalam urutan dan banyak baris yang pasti ada di kedua file.tidak akan menghasilkan keluaran jika
file1
berisi semua baris masukfile2
dan keluar dengan status0
, jika tidak akan mencetak sesuatu sepertidan keluar dengan status
1
sumber
Gunakan program Python:
Pemakaian:
Status keluar program menunjukkan apakah semua pola file 2 cocok:
Untuk menanyakan status keluar dalam shell (skrip) Anda dapat menggunakan
$?
variabel khusus atau ekspresi lain yang mengevaluasi status keluar perintah, mis. Operator hubung singkat&&
dan||
dan ekspresi kondisional sepertiif
atauwhile
. Contoh:sumber
combine
dari moreutils akan menunjukkan kepada Anda semua barisfile2
yang tidak terkaitfile1
dengan:Kemudian Anda dapat menghitung jumlah garis dengan memipangnya
wc -l
, seperti:sumber