รวมบรรทัดสำรองจากสองไฟล์


9

file1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

file2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

ไฟล์ที่ส่งออก:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
กรุณาเสมอพูดถึงระบบปฏิบัติการของคุณ เครื่องมือมาตรฐานจำนวนมากทำงานแตกต่างกันไปตามระบบปฏิบัติการที่แตกต่างกันดังนั้นเราจำเป็นต้องรู้ว่าคุณกำลังใช้อะไรอยู่
terdon

คำตอบ:




5

การpasteแก้ปัญหาเป็นแบบพกพาและมีประสิทธิภาพ ฉันพูดถึงทางเลือกนี้เฉพาะในกรณีที่คุณต้องการใช้พฤติกรรมในกรณีที่ไฟล์ทั้งสองไม่มีจำนวนบรรทัดเท่ากัน:

ด้วย GNU sed:

sed Rfile1 file2

หากfile1มีบรรทัดน้อยกว่าfile2เมื่อfile1หมดแล้วsedจะไม่ส่งออกสิ่งใดสำหรับมัน (เมื่อเทียบกับบรรทัดว่างสำหรับpaste)

หากfile1มีจำนวนบรรทัดมากกว่าจะมีการลบบรรทัดส่วนเกินfile2เหล่านั้น (ตรงข้ามกับการพิมพ์บรรทัดว่างไว้file2ด้วยpaste)

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

การใช้awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRจับคู่ก็ต่อเมื่อหมายเลขระเบียนปัจจุบันเท่ากับจำนวนระเบียนไฟล์ปัจจุบัน (ดังนั้นจะถูกจับคู่ขณะประมวลผลไฟล์แรกเท่านั้น): จัดเก็บระเบียนที่ประมวลผลในปัจจุบันลงในอาร์เรย์xที่ดัชนีเท่ากับหมายเลขระเบียนไฟล์ปัจจุบันและข้าม บันทึกปัจจุบัน
  • {print x[FNR]"\n"$0}: พิมพ์เนื้อหาของอาร์เรย์xที่ดัชนีเท่ากับจำนวนระเบียนไฟล์ปัจจุบันตามด้วย newline และเนื้อหาของระเบียนปัจจุบัน
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

มันให้ผลลัพธ์ แต่ไม่ตรงกับที่ฉันต้องการ บรรทัด tid.info กำลังมาหลังจากบรรทัด tid.setnr ในไฟล์เอาต์พุตของฉัน
pmaipmui

@Nainita นั่นคือสิ่งที่คุณแสดงในตัวอย่างผลลัพธ์ของคุณ
kos

@Nainita ต่อไปเพื่อสลับลำดับของเอาต์พุตที่คุณสามารถสลับfile1และfile2ในคำสั่ง
kos

ใช่ ... ฉันทำแบบเดียวกัน แต่มันก็ทำการพิมพ์เหมือนเดิม หลังจากพิมพ์ tid.setnr แล้วมันก็กำลัง priting tid.info
pmaipmui

1
@ mikeserv อย่างไรก็ตามตั้งแต่ที่ฉันอยู่ที่นี่ฉันก็ลองmawkและมันก็วิ่งต่อไป ยังมีเหตุผลฉันไม่สามารถเห็นได้ว่าทำไมมันไม่ควรทำงานอย่างอื่น (เช่นเพียงแค่สลับไฟล์) มันไม่awkเกี่ยวกับการป้อนข้อมูลเส้นเป็นเส้น หากบางสิ่งบางอย่างไม่ได้รับการสนับสนุนโดยรุ่นของเขามันก็จะพังในครั้งแรก วิธีที่ง่ายกว่าเพียงแค่ OP ผิดพลาดในการสลับไฟล์อินพุตในอาร์กิวเมนต์
kos

-1

ทางออกที่ง่ายที่สุดได้รับด้านล่าง

cat file1 >> file2

หรือ

cat file2 >> file1

1
สาชินอ่านคำถามอีกครั้ง สิ่งนี้จะผนวกเนื้อหาของไฟล์หนึ่งไปยังเนื้อหาของไฟล์อื่น มันจะไม่รวมไฟล์ที่สลับสาย (ดังนั้นหนึ่งบรรทัดจากfile1นั้นหนึ่งบรรทัดจากfile2และอื่น ๆ ... )
don_crissti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.