शेल पर, मैं एक विशेष कॉलम की आवश्यकता होने पर जागने के लिए पाइप करता हूं।
उदाहरण के लिए यह कॉलम 9 प्रिंट करता है:
... | awk '{print $9}'
मैं कॉलम 9 सहित सभी कॉलमों को प्रिंट करने के लिए awk को कैसे बता सकता हूं , सिर्फ कॉलम 9 को नहीं?
जवाबों:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
या इसके perl
लिए उपयोग करना बेहतर होगा। इसका उपयोग केवल तभी करें जब आप वास्तव में इस पर जोर देते हैं awk
।
जब आप खेतों की एक श्रृंखला करना चाहते हैं, awk
तो वास्तव में ऐसा करने के लिए एक सीधा आगे रास्ता नहीं है। मैं cut
इसके बजाय की सिफारिश करेंगे :
cut -d' ' -f 9- ./infile
डिफ़ॉल्ट रूप से एक टैब होने के कारण अंतरिक्ष क्षेत्र का परिसीमन जोड़ा गया। यह इंगित करने के लिए ग्लेन का धन्यवाद
find . | xargs ls -l | cut -d' ' -f 9-
। किसी कारण से डबल स्पेस भी गिना जाता है। उदाहरण: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
परिणामस्वरूप./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
संपादित करें : ध्यान दें, यह काम नहीं करता है यदि नौवें से पहले किसी भी क्षेत्र में नौवें के समान मूल्य है।
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
चर चौड़ाई व्हाट्सएप से निपटने के बजाय, सभी व्हाट्सएप को सिंगल स्पेस के रूप में बदलें। फिर cut
ब्याज के क्षेत्रों के साथ सरल का उपयोग करें ।
यह awk का उपयोग नहीं करता है इसलिए जर्मे नहीं है, लेकिन अन्य उत्तरों / टिप्पणियों को देखते हुए उचित प्रतीत होता है।
ps faux |
उपयोग के लिए आदर्श है । उपकरण स्वीकार करने से कभी न डरें XYZ सबसे उपयुक्त नहीं है।
आम तौर पर perl की जगह awk / sed / grep et होती है। अल।, और बहुत अधिक पोर्टेबल है (और साथ ही सिर्फ एक बेहतर पेनकेन भी है)।
perl -lane 'print "@F[8..$#F]"'
टिमटॉवडी बेशक लागू होता है।
-l
जोड़ने या \n
प्रिंट स्टेटमेंट में जोड़ने की आवश्यकता है।
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
यह दी गई फील्ड nr।, N से पहले है, और क्षेत्र nr.N सहित सभी लाइन को प्रिंट करता है और मूल रिक्ति को बनाए रखता है (यह सुधार नहीं करता है)। यदि क्षेत्र का तार कहीं और पंक्ति में भी दिखाई देता है, तो यह मैटर नहीं करता है, जो कि असकर के उत्तर के साथ समस्या है।
एक फ़ंक्शन को परिभाषित करें:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
और इसे इस तरह से उपयोग करें:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
आउटपुट सब कुछ बनाए रखता है, जिसमें N के लिए रिक्त स्थान शामिल है = 0 के लिए यह पूरी लाइन को लौटाता है, जैसा कि है, और n> NF के लिए एक स्ट्रिंग है
यहाँ ls -l
आउटपुट का एक उदाहरण है :
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
कुछ भी पोस्ट छापने का मेरा समाधान $9
हैawk '{print substr($0, 61, 50)}'
पहले 3 फ़ील्ड प्रदर्शित करने के लिए और शेष फ़ील्ड प्रिंट करने के लिए जिनका आप उपयोग कर सकते हैं:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
जहां $ 1 $ 2 $ 3 पहले 3 क्षेत्र हैं।
जाग के बजाय कट का उपयोग और -c चरित्र कटौती आदेश का उपयोग करके शुरू करने के लिए कौन सा कॉलम पता लगाने के साथ मुद्दों पर काबू पाने।
यहाँ मैं कह रहा हूँ, मुझे आउटपुट के पहले ४ ९ अक्षर दें।
ls -l /some/path/*/* | cut -c 50-
/*/*/
Ls कमांड के अंत में मुझे शो क्या उपनिर्देशिका में भी है कह रहा है।
आप वर्णों की कुछ श्रेणियों को अलग भी कर सकते हैं (कट मैन पेज से)। उदाहरण के लिए, वर्तमान में लॉग किए गए उपयोगकर्ताओं के नाम और लॉगिन समय दिखाएं:
who | cut -c 1-16,26-38