बिल्ली आदेश द्वारा रिक्त लाइनों को प्रदर्शित करें


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]  

मार्गदर्शन चाहिए।


क्या फ़ाइलें कभी एक पंक्ति में अधिक होती हैं,?
रोइमा

नहीं, केवल 1 पंक्ति
मेवा

1
उह, जब आपने लिखा तो [Blank]क्या आपका मतलब उन 7 पात्रों से था या आपने खाली रेखा को इंगित करने का इरादा किया था?
रोइमा

1
बिल्ली का उपयोग नहीं करके। अपने आप को विवश मत करो।
ctrl-alt-delor

जवाबों:


20

catडेटा को आउटपुट नहीं कर सकता है जो फाइलों में मौजूद नहीं है। यदि कोई फ़ाइल खाली है, तो आउटपुट के रूप में एक खाली लाइन प्रदान करने के लिए उसके पास कोई नई पंक्ति वर्ण भी नहीं है।

आप यह सुनिश्चित कर सकते हैं कि फाइलों में कम से कम एक नई लाइन वर्ण हो।

यह awkसुनिश्चित करने के लिए कि आप GNU का उपयोग कैसे करते हैं (यह खाली फ़ाइलों को संशोधित करता है):

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

ENDFILEब्लॉक से किसी भी फ़ाइल को पढ़ने के खत्म करने के बाद निष्पादित किया जाएगा। यदि FNRशून्य है, तो हमने फ़ाइल में कभी भी कोई रेखा नहीं देखी है, इसलिए हम इसमें एक नई पंक्ति सम्मिलित करते हैं। फिर स्क्रिप्ट अगली फ़ाइल के साथ जारी रहती है।

आप तब उपयोग कर सकते हैं catजैसा आपने प्रश्न में किया था।


वैकल्पिक रूप से, फ़ाइल में बदलाव जीएनयू का उपयोग किए बिना awk के बजाय cat :

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

यह ऊपर की तरह खाली फाइलों का पता लगाने का काम करता है, लेकिन फाइल की बजाए नई आउटपुट को मानक आउटपुट पर प्रिंट करता है। 1अंत में द्वारा प्रतिस्थापित किया जा सकता है { print }और गैर खाली फ़ाइलों में सभी डेटा outputted जा करने के लिए कारण होगा।


वैकल्पिक रूप से, एक शेल लूप (किसी भी 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
@ अच्छी बात है! यदि यह आपके मुद्दे को हल करता है, तो कृपया उत्तर को स्वीकार करने पर विचार करें
Kusalananda

@Fewong: या एक और उत्तर स्वीकार करें जो आपको और भी बेहतर बनाने में मदद करता है - हर टाइमज़ोन को मौका देने के लिए यह अच्छा अभ्यास है, इसलिए कोई जल्दी नहीं है।
मसलक

@Fewong निश्चित रूप से कोई जल्दी नहीं है। स्टेफ़नी ने एक छोटा और कॉम्पैक्ट समाधान भी लिखा है, जो आशाजनक लगता है।
Kusalananda

@ कुसलानंद, धन्यवाद और मैंने परीक्षण किया कि यह काम कर रहा है।
फिवोंग

16

साथ में perl

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

जो अंत में गायब होने पर एक नई पंक्ति वर्ण जोड़ता है, इसलिए खाली फ़ाइलों के लिए एक खाली पंक्ति का उत्पादन करेगा, लेकिन गैर-रिक्त फ़ाइलों के लिए एक नई पंक्ति भी जोड़ेगा जो लोगों को याद करते हैं (और अंत में एक पंक्ति में संक्षिप्त किया जा रहा है 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
शायद सबसे तेज़ समाधान नहीं है (प्रत्येक फ़ाइल के लिए शेल खोलना), लेकिन केवल एक अब तक जो वास्तव में काम करेगा यदि आपके पास वर्तमान निर्देशिका में ऐसी लाखों फाइलें हैं (शेल विस्तार का उपयोग नहीं कर रही हैं और एआरजीवी सीमा को मार रही हैं)।
मतिजा नालिस

1
@ मतिजा नालिस: बहुत सच! लेकिन आप वास्तव में 5 फाइलों की परवाह नहीं करेंगे।
फ्लोइम स्वयं

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 ] यह सच है कि यदि फ़ाइल मौजूद है और इसका आकार शून्य से अधिक है।

$ 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झंडे की कोई आवश्यकता नहीं है ।
टोबी स्पाइट

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

कहाँ - मानक इनपुट से बिल्ली को पढ़ने में सक्षम करेगा।

इसलिए, आपकी फ़ाइलों की सामग्री प्रदर्शित करने के बाद बिल्ली आपके इनपुट की प्रतीक्षा करेगी। यदि आप चाहते हैं तो शाब्दिक रिक्त स्थान या [रिक्त] के लिए एंट्री मारकर आप अपना वांछित इनपुट बना सकते हैं। प्रत्येक इनपुट हिट दर्ज करने के बाद, एक बार सभी इनपुट को प्रेस किया जाता है ^ डी (Ctrl + D) और आपको किया जाता है।

पुनश्च: प्रत्येक इनपुट के लिए आपको संबंधित आउटपुट मिलेगा।

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

इसके साथ आप दो अनुक्रम के बीच रिक्त स्थान या कुछ और, जो आप चाहते हैं, डाल सकते हैं।


इस आधार पर आप केवल catएक समाधान के रूप में पेश कर सकते हैं और ओपी को अपनी अनुमति दे सकते हैं कि वे क्या चाहते हैं।
रोइमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.