मेरे पास एक फ़ाइल है उदाहरण के लिए file.dat.gz जो टैब सीमांकित है।
उदाहरण के लिए
हाय ^ आईएपल ^ इटोस्ट
क्या डब्ल्यूसी का उपयोग कर टैब के बीच गिनना संभव है?
चूंकि उपरोक्त गणना 2, 5, 5 wc होगी 0 लौटाएगी लेकिन यदि यह 8000 से अधिक थी तो क्या यह 1 या सटीक मान सूचीबद्ध कर सकता है?
2 जवाब
wc
की आवश्यकता नहीं है।
$IFS
को अस्थायी रूप से एक read
के आगे की लाइन पर एक टैब पर सेट करें।
यह रिक्त स्थान को बाहर कर देगा (c.f. "a b c")।
एक सरणी में पढ़ें, और प्रत्येक को लूप करें।
लंबाई> 8000 के लिए परीक्षण करें और उसके अनुसार व्यवहार करें। यहां एक त्वरित उदाहरण दिया गया है जिसे आपको अनुकूलित करने में सक्षम होना चाहिए।
$: IFS=" " read -a lst < in
$: for x in "${lst[@]}"
> do l="${#x}"
> if (( l > 8000 ))
> then x='<too long>'
> fi
> printf "'%s' = %d\n" "$x" "$l"
> done
'hi' = 2
'a b c' = 5
'apple' = 5
'<too long>' = 10000
'toast' = 5
यदि आप किसी बड़ी फ़ाइल को संसाधित कर रहे हैं, तो बेहतर प्रदर्शन के लिए उसे awk
या perl
में लिखें।
x
के क्षेत्र में फंस गया।
awk -F'\t' '{for (i=1; i<=NF;i++) if(length($i)>8000) print $i}'
डेमो
$echo -e "hi\tapple\ttoast" | awk -F'\t' '{for (i=1; i<=NF;i++) if(length($i)>2) print $i}'
apple
toast
$echo -e "hi\tapple\ttoast" | awk -F'\t' '{print length($1) , length($2) , length($3)}'
2 5 5
$echo -e "hi\tapple\ttoast"
hi apple toast
$echo -e "hi\tapple\ttoast" | awk -F'\t' '{print length($1) , length($2) , length($3)}'
2 5 5
$echo -e "hi\tapple\ttoast" | awk -F'\t' '{for (i=1; i<=NF;i++) if(length($i)>2) print $i}'
apple
toast
$
संबंधित सवाल
नए सवाल
bash
बैश कमांड शेल के लिए लिखी गई लिपियों के बारे में प्रश्नों के लिए। त्रुटियों / वाक्यविन्यास त्रुटियों के साथ शेल स्क्रिप्ट के लिए, कृपया यहां पोस्ट करने से पहले शेलचेक प्रोग्राम (या वेब शेलचेक सर्वर पर https://shellcheck.net) के साथ उन्हें जांचें। बैश के इंटरैक्टिव उपयोग के बारे में सवाल स्टैक ओवरफ्लो की तुलना में सुपर उपयोगकर्ता पर ऑन-टॉपिक होने की अधिक संभावना है।