awk ลบระหว่างสองรูปแบบที่อ่านจากไฟล์อินพุตในช็อตเดียว

สวัสดีและขอขอบคุณล่วงหน้าสำหรับความช่วยเหลือของคุณ

กำลังพยายามสร้างสคริปต์ด้วย awk แต่ล้มเหลว และฉันสงสัยว่าจะสามารถทำได้หรือไม่ อ่านจากไฟล์อินพุตและลบบรรทัดระหว่างสองรูปแบบ เป็นต้น

ไฟล์ 1 ประกอบด้วย:

user2

และ File2 มีบรรทัด:

ID: user1
Telpephone: 1234-5678

ID: user2
Telpephone: 1324-6598

ID: user3
Telpephone: 9087-6543

ผลลัพธ์ที่ต้องการจะเป็นดังนี้:

ID: user1
Telpephone: 1234-5678

ID: user3
Telpephone: 9087-6543

ฉันสามารถทำได้แบบวนซ้ำ แต่ไฟล์ขนาดใหญ่ใช้เวลานานเกินไป awk จะทำในช็อตเดียวได้ไหม

ความนับถือ.


awk
person vhrp01    schedule 16.07.2018    source แหล่งที่มา
comment
ยังไม่ชัดเจนว่าคุณกำลังพยายามทำอะไร ตัวอย่างที่ให้มาจะแนะนำให้วางบรรทัดจาก File2 ที่ตรงกับเนื้อหา/รูปแบบจาก File1 แต่ชื่อแนะนำให้หล่นระหว่างการแข่งขัน? ในตัวอย่างของคุณ จะเกิดอะไรขึ้นถ้ามีบรรทัดอื่นที่มี user2 คุณจะทิ้งเส้นแบ่งระหว่างพวกเขาทั้งหมดหรือไม่? และถ้ามีสองสามสี่... มีบรรทัดดังกล่าวมากกว่านี้ล่ะ? ยกเว้นทั้งหมดระหว่างการแข่งขันที่อยู่นอกสุดใช่ไหม หรือแทรกแซง?   -  person Ondrej K.    schedule 17.07.2018
comment
วางระหว่างการจับคู่ที่ถูกต้อง เช่น การจับคู่ระหว่าง user2 และช่องว่างแรก หากพบ 1, 2, 3 ให้ลบทั้งหมดแล้วปล่อยบรรทัดระหว่างรายการเหล่านั้น ตัวอย่างเช่น ด้วยคำสั่ง awk '/user2/,/^$/{next}{print}' file2 คุณสามารถลบบรรทัดทั้งหมดระหว่าง user2 และพื้นที่ว่างได้ ปัญหาหรือสิ่งที่ฉันพยายามทำคือมีสตริงอินพุตหลายรายการขนาดใหญ่ เช่น สำหรับอินพุตของผู้ใช้ 10,000 รายและในขนาดไฟล์ 2 หรือ 1GB   -  person vhrp01    schedule 17.07.2018


คำตอบ (1)


ที่ให้ไว้:

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

ID: user2
Telpephone: 1324-6598

ID: user3
Telpephone: 9087-6543

ด้วย awk ในโหมดย่อหน้า:

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

ด้วยการอัปเดต ขณะนี้รองรับคำที่ข้ามได้หลายคำ:

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
มีวิธีที่เป็นไปได้ในการข้ามการแข่งขันมากกว่านัดเดียวหรือไม่? $ cat ข้าม user1 user2 $ cat ไฟล์ ID: user1 Telpephone: 1234-5678 ID: user2 Telpephone: 1324-6598 ID: user3 Telpephone: 9087-6543 เอาต์พุต: ID: user3 Telpephone: 9087-6543 - person vhrp01; 17.07.2018
comment
ใช่. ที่ตายตัว. เพียงใส่การแข่งขันลงในช่องว่างที่คั่นหรือแยกบรรทัด - person dawg; 17.07.2018
comment
ขอแสดงความนับถือ dawg มันทำงานได้อย่างสมบูรณ์แบบตามที่คุณพูดถึง - person vhrp01; 17.07.2018