จะแทรกบรรทัดของไฟล์ตั้งแต่สองไฟล์ขึ้นไปได้อย่างไร


10

ฉันพยายามรับไฟล์ 2 ไฟล์ในไฟล์เดียว ฉันได้ลองคำสั่งด้านล่าง:

cat file1 file2

แต่ที่นี่ข้อมูลจะถูกผนวกกับfile2file1

สิ่งที่ฉันต้องการคือfile1บรรทัดที่ 1 ตามด้วยfile2บรรทัดแรกและfile1บรรทัดที่สองตามด้วยfile2บรรทัดที่สองเป็นต้น

ใครช่วยบอกฉันได้ว่าจะทำในวิธีที่ง่าย?

คำตอบ:


17

มีแอพสำหรับสิ่งนั้น!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

ตอนนี้ถ้าคุณส่งไฟล์เหล่านี้เป็นอาร์กิวเมนต์ไปที่paste:

$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2

หากตาม "file1 บรรทัดที่ 1 ตามด้วย file2 บรรทัดแรกและ file1 บรรทัดที่สองตามด้วย file2 บรรทัดที่สองเป็นต้น" คุณหมายความว่าคุณต้องการให้มีบรรทัดใหม่ระหว่างแต่ละบรรทัดที่วางไว้เพียงแค่ปรับ-dตัวเลือก (ตัวคั่น)

$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2

2

POSIX Awk; สิ่งนี้ใช้ได้กับไฟล์จำนวนเท่าใดก็ได้และไฟล์ไม่จำเป็นต้องมีจำนวนบรรทัดเท่ากัน สคริปต์จะดำเนินต่อไปจนกว่าไฟล์ทั้งหมดจะไม่อยู่ในบรรทัด:

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}

มีปัญหาอย่างหนึ่งคือถ้าอินพุตมีอักขระ '%' จะพยายามวิเคราะห์พวกมันใน printf การอัปเดตของฉันจะเป็น (ฉันไม่แน่ใจว่านี่ถูกต้องสมบูรณ์):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William

0

วิธีทุบตีอย่างรวดเร็ว

# Takes as many file arguments as needed
function InterleaveFiles {

    local counter=0
    local hasLine=true

    while [ $hasLine == true ]; do
            hasLine=false
            for i in "$@"; do
                    line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
                    if [ -n "$line" ]; then
                            echo "$line"
                    hasLine=true
                    fi
            done
            counter=$((counter+1))
    done
}

InterleaveFiles file1 file2 file3 file4


-2
paste -d '\n' file1 file2 > file3

ที่file1และfile2เป็นไฟล์ป้อนข้อมูลและfile3จะถูกส่งออกสร้าง


1
ยินดีต้อนรับสู่ U&L Stack Exchange! คำตอบนี้เกือบจะเหมือนกับคำตอบ terdon ของ ในกรณีที่คุณคิดว่าคุณสามารถปรับปรุงในคำตอบ แต่ไม่ได้ให้ข้อมูลใหม่อย่างมีนัยสำคัญโปรดพิจารณาการเสนอแก้ไขเพื่อคำตอบที่มีอยู่ คำตอบจะถูกจัดลำดับใหม่ตามการลงคะแนนด้วยดังนั้นคำตอบแต่ละข้อควรอยู่ที่ตัวของมันเองหรืออ้างอิงจากคำตอบอื่น ๆ นั่นเป็นสาเหตุที่เชลล์ออนลิเลอร์ควรมีคำอธิบายที่อธิบายการทำงานของเชลล์
โทมัสนีแมน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.