awk hapus antara dua pola pembacaan dari file input dalam satu kesempatan

Halo dan terima kasih sebelumnya atas bantuan Anda.

Mencoba membuat skrip dengan awk, tetapi gagal dan saya bertanya-tanya apakah ini mungkin dilakukan. Membaca dari file input dan menghapus garis di antara dua pola, misalnya.

File1 berisi:

user2

dan File2 berisi baris:

ID: user1
Telpephone: 1234-5678

ID: user2
Telpephone: 1324-6598

ID: user3
Telpephone: 9087-6543

Output yang diinginkan seperti:

ID: user1
Telpephone: 1234-5678

ID: user3
Telpephone: 9087-6543

Saya dapat melakukannya dalam satu putaran, tetapi dengan file besar memakan waktu terlalu lama, apakah mungkin melakukannya dalam satu pengambilan dengan awk?

Salam.


awk
person vhrp01    schedule 16.07.2018    source sumber
comment
Tidak sepenuhnya jelas apa yang Anda coba lakukan. Contoh yang diberikan akan menyarankan penghapusan baris dari File2 yang cocok dengan konten/pola dari File1. Tapi judulnya menyarankan untuk dihilangkan di antara pertandingan? Dalam contoh Anda, apa yang akan terjadi jika ada baris lain yang berisi user2? Apakah Anda akan menghilangkan semua batasan di antara mereka? Dan jika ada dua, tiga, empat... lebih banyak garis seperti itu? Kecualikan semua di antara kecocokan terluar? Atau disisipkan?   -  person Ondrej K.    schedule 17.07.2018
comment
Drop antar kecocokan yang benar, misalnya cocok antara pengguna2 dan spasi pertama. Jika menemukan 1, 2, 3, hapus semuanya dan hilangkan garis di antara keduanya. misalnya dengan perintah awk '/user2/,/^$/{next}{print}' file2, semua baris antara user2 dan spasi dapat dihapus. Masalah atau apa yang saya coba lakukan adalah, dengan banyak string input yang besar, misalnya untuk 10.000 input pengguna dan dalam file2 berukuran 1GB.   -  person vhrp01    schedule 17.07.2018


Jawaban (1)


Diberikan:

$ cat skip
user2
$ cat file
ID: user1
Telpephone: 1234-5678

ID: user2
Telpephone: 1324-6598

ID: user3
Telpephone: 9087-6543

Dengan awk dalam mode paragraf:

awk  'BEGIN{RS=""; ORS="\n\n"}
      FNR==NR{for (i=1;i<=NF;i++) skip[$i]; next}
      $2 in skip {next}
      1' skip file
ID: user1
Telpephone: 1234-5678

ID: user3
Telpephone: 9087-6543

Dengan pembaruan, sekarang mendukung beberapa kata lewati:

awk  'BEGIN{RS=""; ORS="\n\n"}
      FNR==NR{for (i=1;i<=NF;i++) skip[$i]; next}
      $2 in skip {next}
      1' <(echo "user2 user3") file
ID: user1
Telpephone: 1234-5678
person dawg    schedule 16.07.2018
comment
Apakah ada cara yang mungkin untuk melewatkan lebih dari satu pertandingan? $cat skip user1 user2 $cat file ID: user1 Telpephone: 1234-5678 ID: user2 Telpephone: 1324-6598 ID: user3 Telpephone: 9087-6543 Output: ID: user3 Telpephone: 9087-6543 - person vhrp01; 17.07.2018
comment
Ya. Tetap. Letakkan saja korek api di ruang yang dibatasi atau di garis individual. - person dawg; 17.07.2018
comment
Salam hormat, dawg, ini berfungsi dengan baik seperti yang Anda sebutkan. - person vhrp01; 17.07.2018