Boş komutları cat komutuyla görüntüle


11

Aşağıdaki files.txt listesi var:

-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  

Çıktı:

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

Aşağıdaki gibi çıktı nasıl alınır:

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

Rehberlik gerekiyor.


Dosyalar hiç birden fazla satır içeriyor mu?
roaima

Hayır, sadece 1 satır
Fewong

1
Yazarken, [Blank]bu 7 karakteri mi kastettin yoksa boş bir satır mı göstermeyi düşündün?
roaima

1
Kedi kullanmayan. Kendinizi kısıtlamayın.
ctrl-alt-delor

Yanıtlar:


20

catdosyalarda bulunmayan veriler çıktı alınamıyor. Bir dosya boşsa, çıktı olarak boş bir satır sağlayacak yeni satır karakteri bile yoktur.

Dosyaların en az bir satırsonu karakteri içerdiğinden emin olabilirsiniz.

Aşağıdakileri awksağlamak için GNU'yu şu şekilde kullanırsınız (bu, boş dosyaları değiştirir):

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

ENDFILEBlok dosyalarının herhangi okuduktan bittikten sonra çalıştırılacaktır. Eğer FNRsıfır olan Bu araca tek yeni satır eklemek, böylece biz, dosyada herhangi satırları görmedim. Daha sonra komut dosyası bir sonraki dosyayla devam eder.

Daha sonra catsoruda yaptığınız gibi kullanabilirsiniz .


Alternatif olarak, dosyaları değiştirmeden aşağıdakiler awk yerine GNU kullanıncat :

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

Bu, yukarıdaki gibi aynı boş dosya algılamasını yapar, ancak yeni satırı dosya yerine standart çıktıya yazdırır. 1Sonunda yerini olabilir { print }ve boş olmayan dosyalarda tüm verinin çıkışı neden olacaktır.


Alternatif olarak, bir kabuk döngüsü (herhangi bir POSIX kabuğunda çalışmalıdır):

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

-sDosyanın var ve sıfırdan büyük bir boyuta sahipse testi geçerli olacak.


Eğer değişmez dize istiyorsanız [Blank]boş dosyalar için çıkış yapılacak olan, basitçe önünde o dizeyi eklemek \niçin çağrılarda printfyukarıdaki (bu olacak da iş awkkodu).


2
@Fewong İyi! Bu sorununuzu çözerse, lütfen cevabı kabul etmeyi düşünün .
Kusalananda

@Fewong: Ya da size daha da iyi yardımcı olan başka bir cevabı kabul edin - her zaman dilimine bir şans vermek iyi bir uygulamadır, bu yüzden acele etmeyin.
MSalters

@Fewong Kesinlikle acele etmeyin. Stephané de umut verici görünen kısa ve kompakt bir çözüm yazdı.
Kusalananda

@Kusalananda, teşekkürler ve çalıştığını test ettim.
Fewong

16

İle perl

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

Bu, sonunda eksikse yeni satır karakteri ekler, bu nedenle boş dosyalar için boş bir satır çıkarır, ancak boş olan dosyalar için eksik olan satır satırları da eklenir (ve tek satırda bitiştirilir cat).


güzel öneri
erTugRul

13

(Bu tam olarak sorduğunuz şey değil, ama :) Bu tür durumlarda kullanmayı tercih ederim 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 <==

Normalde istediğiniz budur. Değilse seddaha sonra kolay


12

İle xargsve grepşöyle bir şey deneyebilirsiniz:

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

4
Belki de en hızlı çözüm (her dosya için bir kabuk çatallama) değil, şimdiye kadar sadece şu anki dizinde milyonlarca dosya varsa (kabuk genişletmelerini kullanmamak ve ARGV sınırına ulaşmak) işe yarayacak olan tek bir çözüm.
Matija Nalis

1
@MatijaNalis: Çok doğru! Ama gerçekten 5 dosyaya bakmazsınız.
FloHimself

6

[Blank]Demek istediğim, gerçek boş satırlar demek, bunun işe yarayacağını varsayarsak :

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

6

Her dosyayı, içeriğini görüntülemeden önce sıfır uzunluklu olup olmadığını test edebilirsiniz:

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

Bunun awk 1 "$f"yerine kullandım cat "$f"çünkü awkdosya çıktısını yeni satırla bitirmeyi garanti ediyor.

Eğer amaçlanan eğer soruda, yani [blank]bir değişmez, ama sadece boş bir satır olmamalı, kodu ve üstünde çıkarmadan kullanarak uygulayabilirsiniz '[Blank]'sonundan echoaçıklamada.


5

26_SumActive.txt ve 28_SumActive.txt dosyalarınızın boş olduğunu ve içeriklerini görüntülerken boş satırlara ihtiyacınız olduğunu varsayıyorum

Bunun için, dosya listenizi tekrarlayabilir ve içeriklerini görüntüleyebilirsiniz ve dosya boşsa, boş satırı yankılayabilirsiniz.

[ -s FILE ] DOSYA varsa ve boyutu sıfırdan büyükse doğrudur.

$ 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
Veya if [ -s $i ]; then cat $i; else echo -e ""; fi;. Sadece standart kabuk işlevselliğini kullanarak basit bir test için +1.
MSalters

2
Ya da sadece cat "$i"; test -s "$i" || echo- o hantal ifya da taşınabilir olmayan echobayraklara gerek yok.
Toby Speight

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

nerede - kedinin standart girdiden okumasını sağlayacaktır.

Böylece, dosyalarınızın içeriğini görüntüledikten sonra kedi girişinizi bekleyecektir. Değişmez boşluklar için enter tuşuna basarak veya istediğiniz boşsa [Boş] tuşuna basarak istediğiniz girişi yapabilirsiniz. Girilen her girişten sonra, tüm girişler yapıldıktan sonra ^ D (Ctrl + D) tuşlarına basın ve işiniz bitti.

PS: Her giriş için ilgili çıkış elde edersiniz.

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

Bununla, iki çıkış dizisi arasına boşluklar veya başka bir şey koyabilirsiniz.


Bu temelde sadece catbir çözüm sunabilir ve OP'ye istediklerine izin verebilirsiniz.
roaima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.