तीसरे कॉलम को अंतिम कॉलम में कैसे प्रिंट करें?


121

मैं DbgView लॉग फ़ाइल से पहले दो कॉलम (जिनमें से मुझे कोई दिलचस्पी नहीं है) निकालने की कोशिश कर रहा हूं। मुझे एक उदाहरण नहीं मिल रहा है जो पंक्ति के अंत तक कॉलम 3 से प्रिंट करता है। ध्यान दें कि प्रत्येक पंक्ति में स्तंभों की चर संख्या है।


जवाबों:


108

... या एक सरल समाधान: cut -f 3- INPUTFILE बस सही सीमांकक (-d) जोड़ें और आपको एक ही प्रभाव मिला।


9
ध्यान दें कि यह केवल तभी काम करता है जब सीमांकक सभी स्तंभों के बीच बिल्कुल समान हो ... उदाहरण के लिए, आप किसी परिसीमन जैसे \ d + के साथ कट का उपयोग नहीं कर सकते। (जो मुझे पता है।)
ज़च विली

72
जब प्रश्न का शीर्षक awk होता है तो awk के अलावा उत्तर को स्वीकार करना अनुचित होता है। क्या होगा अगर लोगों को जागृत स्क्रिप्ट के लिए इसकी आवश्यकता है? यह जवाब सिर्फ एक टिप्पणी होना चाहिए था।
syaz

24
@ SyaZ: आम तौर पर मैं सहमत होता हूं, लेकिन इस बोर्ड में 'ग्रैटुइटस एस्क' की मात्रा के साथ, मैंने सोचा कि यह कार्य करने का एक वैकल्पिक तरीका दिखाने की आवश्यकता है। यदि कोई आपको एक ही कार्य करने के लिए एक सरल और तेज रास्ता दिखाए तो क्या आप आभारी नहीं होंगे? हो सकता है कि पोस्टर सोचा था कि यह अन्य प्रश्नों के उत्तर 'गलत नहीं, लेकिन निश्चित रूप से अनुचित' होने की वजह से ऐसा करने का एकमात्र तरीका है?
Marcin

12
यह टिप्पणी किस लिए है सर्वश्रेष्ठ awk उत्तर को स्वीकार करें और टिप्पणियों पर बेहतर गैर-जागृत सुझाव प्रदान करें। यदि लोग ऐसे उत्तर पोस्ट करना शुरू कर देते हैं जो सवालों के बिल्कुल जवाब नहीं देते हैं, तो खोज करते समय यह कष्टप्रद होगा (मेरे मामले में)।
syaz

12
सभी स्तंभों के बीच न केवल सीमांकक होना आवश्यक है, बल्कि स्तंभों के बीच सटीक रूप से एक परिसीमन चरित्र होना चाहिए। इसलिए यदि आप ऐसे प्रोग्रामों के साथ काम कर रहे हैं जो उनके आउटपुट को सीमांकक के साथ संरेखित करते हैं, तो awk का उपयोग करना बेहतर है।
sknaumov

112
awk '{for(i=3;i<=NF;++i)print $i}' 

3
awk '{for (i = 3; i <= NF; ++ i) प्रिंट $ i}' अधिक कॉम्पैक्ट हो। :)
user172818

1
धन्यवाद, lh3 मैं सिर्फ gawk मैनुअल के लिए कॉपी और पेस्ट कर रहा था। :)
जोनाथन फीनबर्ग

23
यह कई लाइनों के साथ विफल रहता है, प्रत्येक कॉलम को एक नई लाइन के रूप में
विभाजित किया जाता है

13
स्प्लिटेड आउटपुट मुद्दे को संबोधित करने के लिए, मैं इस समाधान का प्रस्ताव करता हूं: awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'( नई फ़ील्ड को printfप्रिंट नहीं करेगा, जबकि print ""अन्य क्षेत्रों के मुद्रित होने के बाद न्यूलाइन जोड़ देगा)
lauhub

1
या: echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'जो देता है 3 4 5 6 7 8 9 10:।
x-yuri

106
awk '{ print substr($0, index($0,$3)) }'

समाधान यहाँ पाया गया:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/


23
मैं इसके लिए देर से हूँ, लेकिन यह उन रिकॉर्ड्स के लिए काम नहीं करेगा, जिसमें पहला या दूसरा क्षेत्र तीसरे (जैसे, 3 2 3 4 5) के
बराबर है

एक आंतरिक सीमा को मुद्रित करना भी संभव है: $ 3 (शामिल) से $ 6 (बहिष्कृत) तक `` `; इको "1,2,3,4,5,6,7,8,9" | awk 'BEGIN {FS = ","; OFS = ","} {प्रिंट पदार्थ ($ 0, index ($ 0, $ 3), लंबाई ($ 0) -index ($ 0, $ 6) -1)}); # ३, ४,५,५`` `
१२

34

जोनाथन फीनबर्ग का जवाब प्रत्येक क्षेत्र को एक अलग लाइन पर प्रिंट करता है। आप printfएक ही लाइन पर आउटपुट के लिए रिकॉर्ड को फिर से बनाने के लिए उपयोग कर सकते हैं, लेकिन आप फ़ील्ड्स को बाईं ओर जंप भी कर सकते हैं।

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile

1
ज्ञात हो, कि यह केवल Gnu awk के लिए काम करता है, NFPOSIX द्वारा डीक्रिमेंटिंग की अनुमति नहीं है।
१४

1
@kvantour: यह gawk, mawk, MacOS awk (nawk?) में काम करता है। POSIX इस बात पर मौन प्रतीत होता है कि क्या NFइसे घटाया जा सकता है।
अगली सूचना तक रोक दिया गया।

यह जाग के इन अजीब अंधेरे कोनों में से एक है ।
कांवट

19
awk '{$1=$2=$3=""}1' file

एनबी: यह विधि 1,2,3 क्षेत्रों में "रिक्त स्थान" छोड़ देगी लेकिन समस्या नहीं है यदि आप सिर्फ आउटपुट देखना चाहते हैं।


ट्रेल कि कमान के साथ `| sed s / ^ \ * // | कॉलम -t` अग्रणी स्थानों को स्ट्रिप करने के लिए और शेष कॉलमों को संरेखित करने के लिए
MSpreij

आखिरी का क्या 1मतलब है? मुझे किस कीवर्ड से खोज करनी चाहिए awk?
इताची

@ इताची उदाहरण 1 देखें catonmat.net/blog/awk-one-liners-explained-part-one
kvantour

1
@ नथन आप इस मुद्दे को हल करते हैं{$1=$2=$3="";$0=$0;$1=$1}1
17

11

यदि आप एक ही पंक्ति में उदाहरण के लिए 3 के बाद कॉलम प्रिंट करना चाहते हैं, तो आप उपयोग कर सकते हैं:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

उदाहरण के लिए:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

यह प्रिंट होगा:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

जैसा कि हम देख सकते हैं, अंतरिक्ष में भी पेप्लिप सही लाइन में दिखाता है।


जल्दी और चिकना। धन्यवाद;)
9 एनजी

यह उत्कृष्ट है, सिवाय इसके कि मुझे $ NF के बाहर होने की समस्या है। जब मैं शर्त सेट करता हूं (<= NF) तो मुझे अंतिम फ़ील्ड मिल जाती है लेकिन पहले फ़ील्ड का पहला वर्ण कटा हुआ होता है। क्या मैं कार्यक्षमता के मामले में कुछ गलत समझ रहा हूं?
केन इंग्राम

ऐसा लगता है कि मेरी समस्या यह है कि ^ अंतिम कॉलम के अंत में एम अटका हुआ है। इसे देखने का तरीका न देखें।
केन इंग्राम

8

निम्नलिखित पंक्ति के बारे में क्या:

awk '{$ 1 = $ 2 = $ 3 = ""; फ़ाइल छापें

@ Ghostdog74 सुझाव के आधार पर। जब आप लाइनों को फ़िल्टर करते हैं, तो खान को बेहतर व्यवहार करना चाहिए:

awk '/ ^ exim4-config / {$ 1 = ""; फ़ाइल छापें

छोटा और सरल। sed 's/\s\+//g'प्रमुख स्थानों को ट्रिम करने के लिए कमांड के अंत में पाइप और जोड़ सकते हैं
कूदते_मोन

8
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

यह दी गई फील्ड nr।, N से पहले है, और क्षेत्र nr.N सहित सभी लाइन को प्रिंट करता है और मूल रिक्ति (यह सुधार नहीं करता है) को बनाए रखता है। यह मैटर नहीं करता है यदि फ़ील्ड का स्ट्रिंग लाइन में कहीं और भी दिखाई देता है, जो कि daisaa के उत्तर के साथ समस्या है।

एक फ़ंक्शन को परिभाषित करें:

fromField () { 
awk -v m="\x0a" -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' रिकॉर्ड विभाजक है, ताकि आपके पास लाइनों के अंदर नया-नया वर्ण न हो। यदि आप इसे अन्य रिकॉर्ड विभाजकों के साथ उपयोग करना चाहते हैं तो उपयोग करें:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

उदाहरण के लिए। लगभग सभी फाइलों के साथ अच्छी तरह से काम करता है जब तक वे हेक्साडेसिमल चार एनआर का उपयोग नहीं करते हैं। 1 लाइनों के अंदर।


4

निम्न awk कमांड प्रत्येक पंक्ति के अंतिम N फ़ील्ड को प्रिंट करता है और लाइन के अंत में एक नई लाइन वर्ण प्रिंट करता है:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

एक उदाहरण के नीचे खोजें जो / usr / बिन निर्देशिका की सामग्री को सूचीबद्ध करता है और फिर अंतिम 3 पंक्तियों को रखता है और फिर awk का उपयोग करके प्रत्येक पंक्ति के अंतिम 4 स्तंभों को प्रिंट करता है:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

4
awk '{a=match($0, $3); print substr($0,a)}'

पहले आप तीसरे कॉलम की शुरुआत की स्थिति पाते हैं। रूट के साथ आप लाइन के अंत में स्थिति (इस मामले में) से शुरू होने वाली पूरी लाइन ($ 0) प्रिंट करेंगे।


3

ठीक है, आप नियमित अभिव्यक्ति का उपयोग करके आसानी से एक ही प्रभाव को पूरा कर सकते हैं। विभाजक को एक स्थान मानते हुए, ऐसा लगेगा:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

1
मैं regex से बचना चाहिए। यह शायद धीमा है और गलती से गड़बड़ करना आसान है।
कैस्केबेल

1
यह इसे इस तरह छोटा करता है: awk '{ sub(/([^ ]+ +){2}/, ""); print }'जो पैटर्न को दो बार दूर ले जाता है।
15:11


2

पर्ल समाधान:

perl -lane 'splice @F,0,2; print join " ",@F' file

इन कमांड-लाइन विकल्पों का उपयोग किया जाता है:

  • -n इनपुट फ़ाइल की प्रत्येक पंक्ति के चारों ओर लूप, स्वचालित रूप से प्रत्येक पंक्ति को प्रिंट न करें

  • -l प्रसंस्करण से पहले नए सिरे को हटाता है, और बाद में उन्हें वापस जोड़ता है

  • -aऑटोसप्लिट मोड - @F सरणी में इनपुट लाइनों को विभाजित करें। व्हॉट्सएप पर बंटवारे की चूक

  • -e पर्ल कोड निष्पादित करें

splice @F,0,2 @F सरणी से कॉलम 0 और 1 को सफाई से हटाता है

join " ",@F प्रत्येक तत्व के बीच में एक जगह का उपयोग करके @F सरणी के तत्वों को जोड़ता है

यदि आपकी इनपुट फ़ाइल अंतरिक्ष-सीमांकित के बजाय अल्पविराम-सीमांकित है, तो उपयोग करें -F, -lane


अजगर समाधान:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file


1

यहां थोड़ी देर हो गई, लेकिन ऊपर से कोई भी काम नहीं कर रहा था। यह प्रयास करें, प्रिंटफ का उपयोग करते हुए, प्रत्येक के बीच रिक्त स्थान डालें। मैं अंत में newline नहीं चुना है।

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'

1
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

उसी क्षेत्र में 4 डी फ़ील्ड से अंतिम फ़ील्ड तक प्रिंट रिकॉर्ड उसी क्रम में किए गए थे जो वे मूल फ़ाइल में थे


क्षमा करें, यह बहुत सही उत्तर नहीं था। यह बहुत विशिष्ट है, लेकिन मुझे नहीं पता कि इसे कैसे हटाया जाए
मैसिमो


0

यदि इसके बारे में केवल पहले दो क्षेत्रों की उपेक्षा और यदि आप उन क्षेत्रों को मास्क करते समय कोई स्थान नहीं चाहते हैं (जैसे ऊपर दिए गए कुछ उत्तर):

awk '{gsub($1" "$2" ",""); print;}' file

0
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

पहले दो कॉलम साफ हो जाते हैं, sedप्रमुख स्थानों को हटा देता है।


-2

AWK कॉलम को फ़ील्ड कहा जाता है, इसलिए NF कुंजी है

सभी पंक्तियाँ:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

केवल पहली पंक्ति:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.