ฉันมี 14 ไฟล์ทั้งหมดเป็นส่วนหนึ่งของข้อความ ฉันต้องการรวมพวกเขาเป็นหนึ่งเดียว ทำอย่างไร
ฉันมี 14 ไฟล์ทั้งหมดเป็นส่วนหนึ่งของข้อความ ฉันต้องการรวมพวกเขาเป็นหนึ่งเดียว ทำอย่างไร
คำตอบ:
นี่คือเทคนิคที่cat
ควรทำ ("concatenate") แม้ว่าคนส่วนใหญ่จะใช้เพื่อส่งไฟล์ไปยัง stdout หากคุณให้ชื่อไฟล์หลาย ๆ ไฟล์ชื่อนั้นจะส่งออกไปตามลำดับทั้งหมดจากนั้นคุณสามารถเปลี่ยนเส้นทางนั้นให้เป็นไฟล์ใหม่ ในกรณีของไฟล์ทั้งหมดที่ใช้*
(หรือ/path/to/directory/*
ถ้าคุณไม่ได้อยู่ในไดเรกทอรีแล้ว) และเชลล์ของคุณจะขยายไปยังชื่อไฟล์ทั้งหมด
$ cat * > merged-file
numeric_glob_sort
ตัวเลือก)
หากไฟล์ของคุณไม่อยู่ในไดเรกทอรีเดียวกันคุณสามารถใช้คำสั่ง find ก่อนการต่อข้อมูล:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
มีประโยชน์มากเมื่อไฟล์ของคุณได้รับคำสั่งแล้วและคุณต้องการรวมมันเพื่อวิเคราะห์
พกพาได้มากกว่า:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
สิ่งนี้อาจเป็นไปได้หรือไม่รักษาลำดับไฟล์
"*.csv"
ตั้งแต่เปลือกจากนั้นก็จะผ่านตัวอักษรเพื่อ*
find
คำสั่ง
$ cat * > merged-file
ที่จริงแล้วมีผลข้างเคียงที่ไม่พึงประสงค์ของการรวม 'ไฟล์ผสาน' ในการเรียงต่อกันสร้างไฟล์วิ่งหนี เมื่อต้องการปัดเศษนี้ให้เขียนไฟล์ที่ถูกผสานไปยังไดเรกทอรีอื่น
$ cat * > ../merged-file
หรือใช้การจับคู่รูปแบบที่จะละเว้นไฟล์ที่ผสาน
$ cat *.txt > merged-file
cat * > merged-file
ทำงานได้ดี Globs ถูกประมวลผลก่อนที่จะสร้างไฟล์ หากmerged-file
มีอยู่แล้วcat
(อย่างน้อยของฉัน) จะตรวจพบว่าเป็นไฟล์เอาต์พุตและปฏิเสธที่จะอ่าน หากไฟล์มีอยู่แล้วและคุณมีการเปลี่ยนเส้นทางในภายหลังในไปป์ไลน์แล้วเห็นได้ชัดว่าไม่สามารถทำได้ดังนั้นจากนั้นคุณจะได้รับไฟล์ควบคุมไม่ได้
cat
ไม่มีวิธีตรวจสอบว่าไฟล์เป็นไฟล์เอาท์พุตหรือไม่ การเปลี่ยนเส้นทางเกิดขึ้นในเชลล์ cat
พิมพ์บน stdout เท่านั้น
เหมือนที่คนอื่น ๆ พูดที่นี่ ... คุณสามารถใช้ cat
ให้บอกว่าคุณมี:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
และคุณต้องการเพียงfile01
ไปfile03
และfileA
เพื่อfileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
หรือใช้การขยายรั้ง:
cat ~/file0{1..3} ~/file{A..C} > merged-file
หรือใช้การขยายรั้งนักเล่น:
cat ~/file{0{1..3},{A..C}} > merged-file
หรือคุณสามารถใช้for
วง:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
จะไม่ทำงานเป็นรูปแบบที่ทำให้เป็นก้อนกลม
คุณสามารถระบุpattern
ไฟล์จากนั้นรวมไฟล์ทั้งหมดดังต่อไปนี้:
cat *pattern* >> mergedfile
อีกตัวเลือกหนึ่งคือ:
sed r 1.txt 2.txt 3.txt > merge.txt
หรือ...
sed h 1.txt 2.txt 3.txt > merge.txt
หรือ...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
หรือไม่มีการเปลี่ยนเส้นทาง ...
sed wmerge.txt 1.txt 2.txt 3.txt
โปรดทราบว่าการเขียนบรรทัดสุดท้ายยัง merge.txt (ไม่ใช่ wmerge.txt!) คุณสามารถใช้ w "merge.txt" เพื่อหลีกเลี่ยงความสับสนกับชื่อไฟล์และ -n สำหรับเอาต์พุตเงียบ
แน่นอนคุณยังสามารถย่อรายการไฟล์ด้วยไวด์การ์ด ตัวอย่างเช่นในกรณีของไฟล์ที่มีหมายเลขตามตัวอย่างข้างต้นคุณสามารถระบุช่วงด้วยเครื่องหมายปีกกาด้วยวิธีนี้:
sed -n w"merge.txt" {1..3}.txt
*
ในลำดับ "ธรรมชาติ" หากคุณมี "file1.txt ... file9.txt ... file14.txt" จะไม่ทำงานเพราะ file1? .txt จะเรียงลำดับระหว่าง file1.txt และ file2.txt คุณต้องเปลี่ยนชื่อเป็น "file01.txt ... file09.txt ... file14.txt" พูดecho *
ถ้าคุณไม่แน่ใจ