วิธีผสานสองไฟล์ทีละบรรทัดใน Bash


178

ฉันมีไฟล์ข้อความสองไฟล์แต่ละไฟล์มีข้อมูลตามบรรทัดเช่นนั้น

file1.txt            file2.txt
----------           ---------
linef11              linef21
linef12              linef22
linef13              linef23
 .                    .
 .                    .
 .                    .

ฉันต้องการรวมไฟล์เหล่านี้ทีละบรรทัดโดยใช้สคริปต์ทุบตีเพื่อรับ:

fileresult.txt
--------------
linef11     linef21
linef12     linef22
linef13     linef23
 .           .
 .           .
 .           .

สิ่งนี้สามารถทำได้ใน Bash

คำตอบ:


272

คุณสามารถใช้paste:

paste file1.txt file2.txt > fileresults.txt

มันทำงานอย่างไรถ้าฉันต้องการใช้ตัวคั่น?
Teja

8
@SOaddictpaste -d "\n" * > results.txt
Ostap Maliuvanchuk

pasteจะแยกแต่ละคอลัมน์มีแท็บจนกว่าคุณจะแทนที่ด้วย-dตัวเลือกเพื่อให้คุณสามารถใช้สิ่งที่ต้องการawk, sedฯลฯ ... การจัดรูปแบบแต่ละบรรทัด ตัวอย่าง: paste file1.txt file2.txt | awk '{printf "%-61s | %s\n", $1,$2}'... สิ่งนี้เลียนแบบdiff --side-by-sideผลลัพธ์)
Yzmir Ramirez

คำตอบที่ดี ใช้เครื่องมือที่สร้างขึ้นสำหรับงาน!
Tony

4
paste -d ""ถึงการต่อแถวที่ไม่มีเส้นแบ่งเขตเว้นวรรค
Victoria Stuart

20

นี่คือวิธีการที่ไม่ใช่การวาง

awk

awk 'BEGIN {OFS=" "}{
  getline line < "file2"
  print $0,line
} ' file1

ทุบตี

exec 6<"file2"
while read -r line
do
    read -r f2line <&6
    echo "${line}${f2line}"
done <"file1"
exec 6<&-

11

ลองทำตาม

pr -tmJ a.txt b.txt > c.txt

1
นอกจากนี้ให้ใช้ตัวเลือก -s หากคุณต้องการเปลี่ยนตัวคั่น (+1)
มิตร

ตัวเลือก J ไม่ทำงานบน macOS Mojave แต่คำสั่งของคุณทำงานได้อย่างสมบูรณ์ ขอบคุณ
เป็ด

8

ตรวจสอบ

man paste

เป็นไปได้ตามด้วยคำสั่งบางอย่างเช่นuntabifyหรือtabs2spaces


Mx สตริงแทนที่ใน Emacs จะนำแท็บออกมาน่าจะเป็นกลุ่มและบางทีโปรแกรมแก้ไขข้อความอื่นก็สามารถทำได้เช่นกัน
เบ็น

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