Tampilkan garis kosong dengan perintah cat

11

Saya punya daftar files.txt, di bawah:

-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  

Keluaran:

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

Cara mendapatkan output seperti di bawah ini:

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

Butuh bimbingan.

Sedikit
sumber
Apakah file pernah mengandung lebih dari satu baris ,?
roaima
Tidak, hanya 1 baris
Beberapa
1
Eh, ketika Anda menulis [Blank], maksud Anda 7 karakter itu atau Anda bermaksud menunjukkan baris kosong?
roaima
1
Dengan tidak menggunakan kucing. Jangan membatasi diri Anda.
ctrl-alt-delor

Jawaban:

20

cattidak dapat menampilkan data yang tidak ada dalam file. Jika file kosong, itu bahkan tidak memiliki karakter baris baru untuk memberikan baris kosong sebagai output.

Anda dapat memastikan bahwa file berisi setidaknya satu karakter baris baru.

Ini adalah bagaimana Anda menggunakan GNU awkuntuk memastikan bahwa (ini memodifikasi file kosong):

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

The ENDFILEblok akan dieksekusi setelah menyelesaikan membaca salah satu file. Jika FNRnol, kami tidak pernah melihat baris apa pun di file, jadi kami memasukkan satu baris baru ke dalamnya. Script kemudian dilanjutkan dengan file selanjutnya.

Anda kemudian dapat menggunakan catseperti yang Anda lakukan dalam pertanyaan.


Atau, tanpa mengubah file, gunakan GNU awk alih-alih cat :

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

Ini melakukan pendeteksian file kosong yang sama seperti di atas, tetapi mencetak baris baru ke output standar daripada ke file. Pada 1akhirnya dapat diganti oleh { print }dan akan menyebabkan semua data dalam file yang tidak kosong akan dihasilkan.


Sebagai alternatif, sebuah loop shell (harus bekerja di shell POSIX):

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

The -stes akan benar jika file ada dan memiliki lebih besar ukuran dari nol.


Jika Anda ingin string literal [Blank]dihasilkan untuk file kosong, cukup masukkan string itu di depan \ndalam panggilan ke printfatas (ini juga akan berfungsi dalam awkkode).

Kusalananda
sumber
2
@Beberapa Bagus! Jika ini menyelesaikan masalah Anda, harap pertimbangkan untuk menerima jawabannya .
Kusalananda
@Fewong: Atau terima jawaban lain yang membantu Anda menjadi lebih baik - praktik yang baik memberi setiap zona waktu kesempatan, jadi tidak perlu terburu-buru.
MSalters
@ Beberapa Pasti tidak terburu-buru. Stephané telah menulis solusi singkat dan ringkas juga, yang terlihat menjanjikan.
Kusalananda
@ Kusalananda, terima kasih dan saya mengujinya berhasil.
Beberapa
16

Dengan perl

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

Yang menambahkan karakter baris baru jika tidak ada di bagian akhir, sehingga akan menampilkan baris kosong untuk file kosong, tetapi juga akan menambahkan baris baru untuk file tidak kosong yang melewatkan file (dan akan berakhir digabungkan pada satu baris dengan cat).

Stéphane Chazelas
sumber
saran yang bagus
erTugRul
13

(Ini bukan apa yang Anda minta, tapi :) Dalam situasi seperti ini saya lebih suka menggunakan 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 <==

Biasanya ini yang Anda inginkan. Jika tidak mudah untuk sednanti

Joao
sumber
12

Dengan xargsdan grepAnda dapat mencoba sesuatu seperti:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]
FloHimself
sumber
4
Mungkin bukan solusi tercepat (forking a shell untuk setiap file), tetapi hanya satu sejauh ini yang benar-benar akan berfungsi jika Anda memiliki jutaan file seperti itu di direktori saat ini (tidak menggunakan ekspansi shell dan mencapai batas ARGV).
Matija Nalis
1
@MatijaNalis: Sangat benar! Tapi Anda benar-benar tidak akan peduli dengan 5 file.
FloHimself
6

Dengan asumsi bahwa yang [Blank]Anda maksud adalah baris kosong literal, ini harusnya berfungsi:

paste -s 2[0-8]_SumActive.txt
Matija Nalis
sumber
6

Anda dapat menguji setiap file untuk melihat apakah panjangnya nol sebelum mencoba menampilkan isinya:

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

Saya telah menggunakan awk 1 "$f"alih-alih cat "$f"karena awkjaminan untuk mengakhiri output file dengan baris baru.

Dalam pertanyaan Anda, jika Anda bermaksud agar [blank]tidak menjadi literal, tetapi hanya baris kosong, Anda dapat menerapkan ini menggunakan kode di atas dan menghapus '[Blank]'dari akhir echopernyataan.

roaima
sumber
5

Saya mengasumsikan file Anda 26_SumActive.txt dan 28_SumActive.txt kosong dan Anda perlu baris kosong saat menampilkan kontennya

Untuk ini, Anda bisa mengulangi daftar file Anda, dan isi isinya, dan jika file kosong, gema baris kosong.

[ -s FILE ] Benar jika FILE ada dan memiliki ukuran lebih besar dari nol.

$ 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 ]
Arushix
sumber
1
Atau if [ -s $i ]; then cat $i; else echo -e ""; fi;. Masih memberi +1 untuk tes sederhana menggunakan fungsionalitas shell standar saja.
MSalters
2
Atau hanya cat "$i"; test -s "$i" || echo- tidak perlu untuk bendera yang sulit ifatau non-portabel echo.
Toby Speight
1
cat 2[0-8]_SumActive.txt -

di mana - akan memungkinkan kucing membaca dari input standar.

Jadi, setelah menampilkan konten file Anda, kucing akan menunggu input Anda. Anda dapat membuat input yang Anda inginkan, dengan menekan enter untuk literal blank atau [Blank] jika itu yang Anda inginkan. Setelah setiap input tekan enter, setelah semua input dibuat tekan ^ D (Ctrl + D) dan Anda selesai.

PS: Untuk setiap input Anda akan mendapatkan output masing-masing.

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

Dengan ini, Anda dapat mengosongkan atau sesuatu yang Anda inginkan, di antara dua urutan output.

Neo_Returns
sumber
Atas dasar ini Anda mungkin juga hanya menawarkan catsebagai solusi dan membiarkan OP untuk apa yang mereka inginkan.
roaima