Linux: cat ที่มีตัวคั่นระหว่างไฟล์


28

ใน Linux หากคุณพิมพ์ cat * คุณจะได้รับสิ่งนี้:

line1 จาก file1
line2 จาก file1
line1 จาก file2
line1 จาก file3
line2 จาก file3
line3 จาก file3

สิ่งที่ฉันต้องการคือการแสดงตัวแยกระหว่างไฟล์ สิ่งนี้:
line1 จาก file1
line2 จาก file1
XXXXXXXXXXXX
line1 จาก file2
XXXXXXXXXXXXXX
line1 จาก file3
line2 จาก file3
line3 จาก file3

เป็นไปได้อย่างง่ายดายด้วยหนึ่งซับง่ายต่อการพิมพ์ด้วยหัวใจ?

คำตอบ:


40

หากคุณไม่ยุ่งเกี่ยวกับลักษณะของตัวคั่น:

tail -n +1 *

มันเยี่ยมมาก! ฉันประหลาดใจที่คำสั่งของคุณแตกต่างจาก tail -n 1 * ฉันไม่พบการกล่าวถึงผลกระทบของ +1 (rathen มากกว่า 1) ในหน้า man
Daniele

1
tail -n Xแสดงบรรทัด X สุดท้าย tail -n +Xเริ่มต้นที่บรรทัด X เริ่มต้นที่ 1นั่นคือมันจะแสดงทั้งหมดยกเว้นบรรทัดแรก (X-1)
Gilles 'หยุดชั่วร้าย'

อาตอนนี้ฉันเห็นได้ในหน้าคน ฉันมองข้ามมันไป เยี่ยมมากขอบคุณกลุ่ม
Daniele

การแก้ปัญหาที่คล้ายกันอยู่ในบทความนี้: everythingsysadmin.com/2012/09/unorthodoxunix.html
TomOnTime

ขออภัยสำหรับความคิดเห็นที่ไม่ดี แต่มันยอดเยี่ยม ขอบคุณ @Gilles
Mike D

17

cd /to/your/directory; for each in *; do cat $each; echo "XXXXXXXXXXX"; done


เอาชนะฉันไปที่ :-)
Sirex

โซลูชั่นของ Gilles ยังสั้นอย่างน่าประทับใจ!
Janne Pikkarainen

ว้าว. ทำงานสงสัย ช่วยฉันเชื่อมต่อโฟลเดอร์ของ JSONs
Mayank Chandak

11
awk 'FNR==1 && NR!=1 {print "XXXXXXXXXXXX"}{print}' *

หรือ

awk 'FNR==1 {print "XXXXXX", FILENAME, "XXXXXX"}{print}' *

หรือ

awk 'FNR==1 {print "XXXXXX File no. " ++count, "XXXXXX"}{print}' *

ใช้ Bash เท่านั้น (ไม่ใช่cat):

for file in *; do printf "$(<"$file")\nXXXXXXXXXXXX\n"; done

แก้ไข:

ใน AWK 4:

awk 'BEGINFILE {print "XXXXXXXXXXXX"}{print}' *

คุณสามารถใช้ตัวคั่นใด ๆ เช่นตัวคั่นในตัวอย่างอื่น ๆ ในคำตอบนี้ ถ้าคุณต้องการที่คั่นในตอนท้ายของแต่ละไฟล์การเปลี่ยนแปลงไปBEGINFILE ENDFILEมันยังสามารถปรากฏที่จุดเริ่มต้นของสคริปต์เพราะมันเป็นเงื่อนไข (แทนที่จะสั่งดำเนินการ)


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