แสดงบรรทัดว่างโดยคำสั่ง cat


11

ฉันมีรายชื่อ files.txt ด้านล่าง:

-rw-rw-r-- 1 root dev 11 May 16 12:18 20_SumActive.txt  
-rw-rw-r-- 1 root dev 11 May 16 12:18 22_SumActive.txt  
-rw-rw-r-- 1 root dev  7 May 16 12:18 24_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 26_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 28_SumActive.txt  

เอาท์พุท:

kpgmeddev01> cat 2[0-8]_SumActive.txt   
Sum: 47760  
Sum: 72000  
Sum: 0

วิธีรับเอาต์พุตดังนี้:

Sum: 47760  
Sum: 72000  
Sum: 0  
[Blank]  
[Blank]  

ต้องการคำแนะนำ


ไฟล์เคยมีมากกว่าหนึ่งบรรทัดหรือไม่?
roaima

ไม่เพียง 1 บรรทัด
Fewong

1
เอ่อเมื่อคุณเขียน[Blank]คุณหมายถึงตัวละครทั้ง 7 ตัวหรือคุณตั้งใจจะระบุบรรทัดว่างเปล่า?
roaima

1
โดยไม่ใช้แมว อย่าบังคับตัวเอง
ctrl-alt-delor

คำตอบ:


20

catไม่สามารถส่งออกข้อมูลที่ไม่มีอยู่ในไฟล์ หากไฟล์ว่างเปล่ามันจะไม่มีอักขระขึ้นบรรทัดใหม่เพื่อให้บรรทัดว่างเป็นเอาต์พุต

คุณสามารถตรวจสอบให้แน่ใจว่าไฟล์มีอักขระขึ้นบรรทัดใหม่อย่างน้อยหนึ่งตัว

นี่คือวิธีที่คุณใช้ GNU awkเพื่อให้แน่ใจว่า (นี่เป็นการแก้ไขไฟล์เปล่า):

awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt   

ENDFILEบล็อกจะดำเนินการหลังจากจบการอ่านไฟล์ใด ๆ ถ้าFNRเป็นศูนย์เราไม่เคยเห็นบรรทัดใด ๆ ในไฟล์ดังนั้นเราจึงแทรกบรรทัดใหม่ขึ้นมาหนึ่งบรรทัด สคริปต์จะดำเนินการต่อกับไฟล์ถัดไป

จากนั้นคุณสามารถใช้catเช่นเดียวกับที่คุณทำในคำถาม


อีกทางหนึ่งโดยไม่เปลี่ยนไฟล์โดยใช้ GNU awk แทน cat :

awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt

นี่เป็นการตรวจจับไฟล์เปล่าแบบเดียวกันกับที่กล่าวมา แต่จะพิมพ์บรรทัดใหม่ไปยังเอาต์พุตมาตรฐานแทนที่จะเป็นไฟล์ 1ในตอนท้ายจะถูกแทนที่ด้วย{ print }และจะทำให้ข้อมูลทั้งหมดในไฟล์ที่ไม่ว่างเปล่าที่จะออกมา


อีกทางหนึ่งคือ shell loop (ควรทำงานกับ POSIX เชลล์):

for name in ./2[0-8]_SumActive.txt; do
    if [ -s "$name" ]; then
        cat "$name"
    else
        printf '\n'
    fi
done

การ-sทดสอบจะเป็นจริงหากไฟล์นั้นมีอยู่และมีขนาดใหญ่กว่าศูนย์


หากคุณต้องการ[Blank]ให้เอาท์พุทสตริงตัวอักษรสำหรับไฟล์ว่างเปล่าเพียงแค่แทรกสตริงนั้นไว้ข้างหน้า\nในการเรียกไปที่printfด้านบน (สิ่งนี้จะทำงานในawkรหัสด้วย)


2
@Fewong ดีมาก! ว่าจะแก้ไขปัญหาของคุณได้โปรดพิจารณายอมรับคำตอบ
Kusalananda

@Fewong: หรือยอมรับคำตอบอื่นที่ช่วยให้คุณดียิ่งขึ้น - เป็นวิธีปฏิบัติที่ดีที่จะให้โอกาสทุกเขตเวลาดังนั้นจึงไม่ต้องรีบร้อน
MSalters

@Fewong แน่นอนไม่รีบร้อน Stephanéได้เขียนคำตอบสั้น ๆ และกะทัดรัดเช่นกันซึ่งดูมีแนวโน้ม
Kusalananda

@ Kusalananda ขอบคุณและฉันทดสอบมันใช้งานได้
Fewong

16

กับ perl

perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt

ซึ่งจะเพิ่มอักขระ newline ถ้าขาดหายไปในตอนท้ายเพื่อจะออกบรรทัดว่างสำหรับไฟล์ที่ว่างเปล่า แต่ยังจะเพิ่มขึ้นบรรทัดใหม่สำหรับไฟล์ที่ไม่ว่างเปล่าที่คนพลาด (และจะจบลงด้วยการถูกตัดแบ่งในบรรทัดเดียวกับcat)


ข้อเสนอแนะที่ดี
erTugRul

13

(นี่ไม่ใช่สิ่งที่คุณถาม แต่ :) ในสถานการณ์ประเภทนี้ฉันชอบที่จะใช้ head

$ head -z 2[0-8]_SumActive.txt
==> 21_SumActive.txt <==
Sum: 47760  
Sum: 72000  
Sum: 0  

==> 22_SumActive.txt <==

==> 25_SumActive.txt <==

==> 28_SumActive.txt <==

โดยปกตินี่คือสิ่งที่คุณต้องการ ถ้าไม่ง่ายในsedภายหลัง


12

ด้วยxargsและgrepคุณสามารถลองบางสิ่งเช่น:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]

4
อาจไม่ใช่วิธีแก้ปัญหาที่เร็วที่สุด (การฟอร์กเชลล์สำหรับแต่ละไฟล์) แต่มีเพียงอันเดียวเท่านั้นที่จะใช้งานได้จริงหากคุณมีไฟล์ดังกล่าวนับล้านไฟล์ในไดเรกทอรีปัจจุบัน (ไม่ใช้การขยายเชลล์และ จำกัด ARGV)
Matija Nalis

1
@MatijaNalis: จริงมาก! แต่คุณจะไม่สนใจ 5 ไฟล์
FloHim เอง

6

สมมติว่า[Blank]คุณหมายถึงบรรทัดว่างตามตัวอักษรสิ่งนี้น่าจะใช้ได้:

paste -s 2[0-8]_SumActive.txt

6

คุณสามารถทดสอบแต่ละไฟล์เพื่อดูว่ามีความยาวเป็นศูนย์หรือไม่ก่อนที่จะแสดงเนื้อหา:

for f in 2[0-8]_SumActive.txt;
do
    [[ -s "$f" ]] && awk 1 "$f" || echo '[Blank]'
done

ฉันใช้awk 1 "$f"แทนcat "$f"เพราะawkรับประกันเพื่อสิ้นสุดการส่งออกของไฟล์ที่มีขึ้นบรรทัดใหม่

ในคำถามของคุณหากคุณตั้งใจว่า[blank]ไม่ควรเป็นตัวอักษร แต่เป็นเพียงบรรทัดว่างคุณสามารถใช้สิ่งนี้โดยใช้รหัสด้านบนและลบออก'[Blank]'จากท้ายechoคำสั่ง


5

ฉันสมมติว่าไฟล์ของคุณ 26_SumActive.txt และ 28_SumActive.txt ว่างเปล่าและคุณต้องการบรรทัดว่างเมื่อแสดงเนื้อหา

สำหรับสิ่งนี้คุณสามารถทำซ้ำในรายการไฟล์และกำหนดเนื้อหาของไฟล์และหากไฟล์ว่างให้ทำเสียงก้องบรรทัดว่าง

[ -s FILE ] จริงถ้า FILE มีอยู่และมีขนาดใหญ่กว่าศูนย์

$ for i in $(ls 2[0-8]_SumActive.txt) ; do  cat $i;  if [ ! -s $i ]; then echo -e ""; fi; done
Sum: 47760  
Sum: 72000  
Sum: 0  
[ Blank Line]
[ Blank Line ]

1
if [ -s $i ]; then cat $i; else echo -e ""; fi;หรือ ยังคง +1 สำหรับการทดสอบอย่างง่ายโดยใช้ฟังก์ชั่นเชลล์มาตรฐาน
MSalters

2
หรือเพียงแค่cat "$i"; test -s "$i" || echo- ไม่จำเป็นต้องifมีechoธงที่เทอะทะหรือไม่พกพา
Toby Speight

1
cat 2[0-8]_SumActive.txt -

ที่ - จะเปิดใช้งาน cat เพื่ออ่านจากอินพุตมาตรฐาน

ดังนั้นหลังจากที่แสดงเนื้อหาของไฟล์ของคุณ cat จะรออินพุตของคุณ คุณสามารถป้อนข้อมูลตามที่คุณต้องการโดยกดปุ่ม Enter สำหรับช่องว่างตามตัวอักษรหรือ [ว่าง] หากต้องการ หลังจากป้อน Hit แต่ละครั้งเมื่อป้อนข้อมูลเสร็จแล้วให้กด ^ D (Ctrl + D) และทำเสร็จแล้ว

PS:สำหรับแต่ละอินพุตคุณจะได้รับผลลัพธ์ที่เกี่ยวข้อง

cat 2[0-8]_SumActive.txt - 4[0-8]_SumActive.txt

ด้วยวิธีนี้คุณสามารถวางช่องว่างหรือสิ่งอื่นที่คุณต้องการระหว่างสองขั้นตอนการส่งออก


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