2014-09-20 4 views
8

मुझे यह जांचने की ज़रूरत है कि फ़ाइल में 1 से अधिक पंक्ति है या नहीं। मैंने यह कोशिश की:यह जांचने के लिए कि किसी फ़ाइल में BASH सशर्त में 1 से अधिक पंक्तियां हैं?

if [ `wc -l file.txt` -ge "2" ] 
then 
    echo "This has more than 1 line." 
fi 


if [ `wc -l file.txt` >= 2 ] 
then 
    echo "This has more than 1 line." 
fi 

ये सिर्फ त्रुटियों की रिपोर्ट करते हैं। मैं कैसे जांच सकता हूं कि किसी फ़ाइल में BASH सशर्त में 1 से अधिक पंक्ति है या नहीं?

उत्तर

18

आदेश:

42 file.txt 

wc साथ काम आते हुए आप फ़ाइल नाम बता रूप में अच्छी तरह:

wc -l file.txt 

तरह उत्पादन उत्पन्न होगा। यह मामले में यह करता है आप एक बार में फ़ाइलों का एक बहुत बाहर की जाँच कर रहे हैं और अलग-अलग करने के साथ ही कुल आंकड़े हैं:

pax> wc -l *.txt 
973 list_of_people_i_must_kill_if_i_find_out_i_have_cancer.txt 
    2 major_acheivements_of_my_life.txt 
975 total 

आप मानक इनपुट पर अपने डेटा उपलब्ध कराने के द्वारा ऐसा करने से wc रोक सकते हैं, तो यह नहीं करता है 'टी पता फ़ाइल नाम:

if [[ $(wc -l <file.txt) -ge 2 ]] 

निम्नलिखित प्रतिलिपि कार्रवाई में यह पता चलता है:

pax> wc -l qq.c 
26 qq.c 

pax> wc -l <qq.c 
26 

एक तरफ के रूप में, आप देखेंगे कि मैंने [[ ]] और $() का उपयोग करने के लिए भी स्विच किया है।

मैं पूर्व को प्राथमिकता देता हूं क्योंकि पिछड़े संगतता (ज्यादातर स्ट्रिंग विभाजन के साथ करने के लिए) के कारण इसमें कम समस्याएं होती हैं और बाद में क्योंकि यह घोंसला निष्पादन योग्य है।

2
if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ] 
... 

आपको हमेशा प्रत्येक सबकमेंड रिटर्न की जांच करनी चाहिए। कमान निम्न स्वरूप में wc -l file.txt रिटर्न उत्पादन:

12 file.txt 

आपको पहले स्तंभ की जरूरत है - आप awk या cut या अपनी पसंद के किसी भी अन्य उपयोगिता के साथ इसे निकाल सकते हैं।

5

एक शुद्ध बैश (≥4) संभावना mapfile का उपयोग कर: क्षेत्र प्रति

#!/bin/bash 

mapfile -n 2 < file.txt 
if ((${#MAPFILE[@]}>1)); then 
    echo "This file has more than 1 line." 
fi 

mapfile builtin भंडार क्या यह एक सरणी (MAPFILE डिफ़ॉल्ट रूप से) में stdin से पढ़ता है, एक पंक्ति। -n 2 का उपयोग करके इसे दो पंक्तियों (दक्षता के लिए) में पढ़ा जाता है। उसके बाद, आपको केवल यह जांचने की आवश्यकता है कि सरणी MAPFILE में एक फ़ील्ड है या नहीं। यह विधि बहुत ही कुशल है।

एक उपज के रूप में, फ़ाइल की पहली पंक्ति ${MAPFILE[0]} में संग्रहीत की जाती है, यदि आपको इसकी आवश्यकता हो। आप पाएंगे कि पिछला न्यूलाइन चरित्र छंटनी नहीं है।

mapfile -t -n 2 < file.txt 
4

कैसे के बारे में: आप अनुगामी न्यू लाइन चरित्र को दूर करने की जरूरत है, -t विकल्प का उपयोग

if read -r && read -r 
then 
    echo "This has more than 1 line." 
fi < file.txt 

-r झंडा लाइन निरंतरता वर्ण सुनिश्चित करने के लिए एक में दो पंक्तियों गुना नहीं है की जरूरत है , जो निम्न फ़ाइल को केवल एक पंक्ति की रिपोर्ट करने का कारण बनता है:

This is a file with _two_ lines, \ 
    but will be seen as one. 
+0

+1 सबसे आसान जवाब। – chepner

+0

@paxdiablo आप सही हैं। धन्यवाद। एक बहस सकता है के बाद से है कि आवेदन के द्वारा परिभाषित किया जाना चाहिए दो पंक्तियों जहां पहले एक एक बैकस्लैश में समाप्त होता है, एक पंक्ति विचार किया जाना चाहिए या नहीं। लेकिन चूंकि 'WC -l' बैकस्लैश इसे यहाँ रूप में अच्छी तरह अनदेखा किया जाना चाहिए ध्यान नहीं देता। – Scrutinizer

संबंधित मुद्दे

 संबंधित मुद्दे