การรวมสองไฟล์ทีละหนึ่งคอลัมน์


12

ฉันมีไฟล์ขนาดใหญ่ 2 ไฟล์ (3000 คอลัมน์, 15,000 แถว) ของรูปแบบต่อไปนี้

file1 (คั่นด้วยแท็บ):

1/0 0/0 0/0
0/0 1/1 0/0
1/1 0/1 0/0

file2 (คั่นด้วยแท็บ):

3 5 2
1 7 10
3 4 3

ฉันต้องการรวมค่าจากคอลัมน์แรกของแต่ละไฟล์กับตัวคั่น ":" จากนั้นไปยังคอลัมน์ที่สองสามและอื่น ๆ ผลลัพธ์ที่ต้องการ (คั่นด้วยแท็บ):

1/0:3 0/0:5 0/0:2
0/0:1 1/1:7 0/0:10
1/1:3 0/1:4 0/0:3

ประสิทธิภาพไม่สำคัญดังนั้นภาษาใดก็ได้ ฉันขอโทษถ้าสิ่งนี้ถูกถามมาก่อน

คำตอบ:


14

อะไรแบบนี้? ทำงานกับข้อมูลตัวอย่างของคุณ:

paste  file{1,2} | awk '{for (i=1;i<=NF/2; i++){printf "%s:%s\t",$i,$(NF/2+i)};printf "\n"}'
1/0:3   0/0:5   0/0:2
0/0:1   1/1:7   0/0:10
1/1:3   0/1:4   0/0:3

2
ฉันรักการวาง +1
glenn jackman

ยุติธรรมเพียงพอ @glennjackman; ฉันจะแก้ไขคำตอบของฉัน
ทิงค์

ใช่ ทำงานอย่างสมบูรณ์แบบ! ขอบคุณสำหรับการตอบสนองอย่างรวดเร็ว.
Jon Degner

9
awk '{
    getline f2 < "file2"
    split(f2, a)
    for (i=1; i<=NF; i++) 
        printf "%s:%s\t", $i, a[i]
    print ""
}' file1

ทำงานได้อย่างสมบูรณ์แม้ว่าฉันจะชอบความเรียบง่ายในการตอบสนองของทิงก์
Jon Degner

1
@JonDegner ถ้าคำตอบนั้น (หรืออันนี้) แก้ไขปัญหาของคุณโปรดสละเวลาสักครู่และยอมรับโดยคลิกที่เครื่องหมายถูกทางด้านซ้าย ที่จะทำเครื่องหมายคำถามว่าตอบแล้วและเป็นวิธีที่แสดงความขอบคุณในเว็บไซต์ Stack Exchange
terdon

6

แนวทางที่แตกต่างกันเล็กน้อย:

paste -d: <(xargs -n1 <file1) <(xargs -n1 <file2) | xargs -n 3

ฉันลงทะเบียนสิ่งนี้ แต่เพิ่งรู้ว่าส่วนที่-n 3ใช้ได้กับตัวอย่างที่มีให้เท่านั้น จำเป็นต้องแก้ไขจำนวนคอลัมน์เพื่อรองรับข้อมูลจริง
tink

@tink แน่นอนใช่ คุณสามารถคำนวณจำนวนคอลัมน์ด้วยสิ่งที่ต้องการhead -n1 | wc -wได้
Michael Vehrs

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