การรวมคอลัมน์จากสองไฟล์แยกกัน


10

วิธีสร้างไฟล์ใหม่ที่ผสานคอลัมน์เลือกจากสองไฟล์โดยใช้ awk? โดยไม่ทำให้คำสั่งซื้อองค์ประกอบของไฟล์ BOTH ยุ่งเหยิง

ตัวอย่าง: ไฟล์ 3 อาจมีคอลัมน์ 1,2,3 จากไฟล์ 1 และคอลัมน์ 4 จากไฟล์ 2

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5

คำตอบ:


4

ลองสิ่งนี้:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5

ขอบคุณ! ฉันยังประสบความสำเร็จในการลองใช้วิธีนี้โดยใช้ gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah

2
@Dovah: คุณสามารถใช้แล้วพิมพ์สาขาที่เลือกไว้ในpaste file1 file2 awk
cuonglm

ร้านค้านี้file2ในหน่วยความจำซึ่งสามารถห้ามได้ถ้าไฟล์มีขนาดใหญ่ มีวิธีที่ง่ายกว่าในการทำสิ่งนี้โดยไม่ต้องใช้หน่วยความจำ (ดูคำตอบของฉัน)
Gilles 'หยุดชั่วร้าย'

17

pasteมีเครื่องมือเฉพาะสำหรับที่: มันเชื่อมต่อแต่ละบรรทัดเต็มจากไฟล์แรกกับบรรทัดที่สอดคล้องจากไฟล์ที่สอง คุณสามารถลบคอลัมน์ที่ไม่ต้องการก่อนหรือหลัง ตัวอย่างเช่นสมมติว่าคอลัมน์ของคุณคั่นด้วยแท็บ:

paste file1.txt file2.txt | cut -f 1,2,3,6

ต่อไปนี้เป็นวิธีการกรองไฟล์ทั้งสองที่อาศัยการทดแทนกระบวนการ ksh / bash / zsh ล่วงหน้า

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk มุ่งเน้นไปที่การประมวลผลครั้งละหนึ่งไฟล์ แต่คุณสามารถโทรgetlineเพื่ออ่านจากไฟล์อื่นแบบขนาน

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

จนถึงตอนนี้ฉันคิดว่าคุณต้องการจับคู่บรรทัดที่ 1 ของไฟล์ 1 กับบรรทัดที่ 1 ของไฟล์ 2, บรรทัดที่ 2 ของไฟล์ 1 กับบรรทัดที่ 2 ของไฟล์ 2 ฯลฯ หากคุณต้องการจับคู่เนื้อหาของคอลัมน์นั่นคือ เรื่องที่แตกต่างอย่างสิ้นเชิง joinจะทำงานโดยมีเงื่อนไขว่าคอลัมน์ที่คุณต้องการจับคู่ถูกเรียงลำดับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.