2013-06-13 10 views
5

मेरे पास AWK कमांड के बारे में एक त्वरित प्रश्न है। मुझे एक ही पंक्ति पर लाइन के अंत तक प्रिंट करने के लिए कमांड की आवश्यकता है, लेकिन फिर जब यह अगली पंक्ति में जाती है तो मुझे इसे दूसरी लाइन पर प्रिंट करने की आवश्यकता होती है। निम्नलिखित उदाहरण बेहतर स्पष्टता प्रदान करेगा। मैं resultsExample1लाइन के अंत तक प्रिंट करने के लिए AWK कमांड

में
This 
is 
line 
one 
This 
is 
line 
two 
And so on.... 

उदाहरण 2 निम्न हो

0 1 2 3 This is line one 
0 1 2 3 This is line two 
0 1 2 3 This is line three 
0 1 2 3 This is line four 

मैं निम्नलिखित की कोशिश की और मिल गया है निम्न परिणाम

awk '{for(i=5;i<=NF;i++) print $i}' fileName >> resultsExample1 

:

मैं एक फ़ाइल है कहते हैं:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample2 
resultsExample2 के लिए

मैं:

This is line one This is line two this is line three This is line four 

मैं भी कोशिश की है:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample3 

लेकिन परिणाम पिछले एक

अंत मैं निम्नलिखित चाहते हैं के रूप में ही थे:

This is line one 
This is line two 
This is line three 
This is line four 

मैं किसी भी मदद के लिए आभारी हूँ! अग्रिम में :)

+2

उदाहरण में, सभी लाइनों स्तंभों की एक ही नंबर है - यह हमेशा अपने इनपुट के साथ मामला है? –

उत्तर

6

धन्यवाद यह सीधी-सपाट हो सकता है cut उपयोग करने के लिए:

$ cut -d' ' -f5- file 
This is line one 
This is line two 
This is line three 
This is line four 

यह कहते हैं: लाइन के अंत तक 5 वीं से अंतरिक्ष से अलग किए क्षेत्रों, प्रिंट पर।

यदि आपके पास फ़ील्ड के बीच में कई रिक्त स्थान हैं, तो आप प्रारंभ में उन्हें tr -s' ' के साथ निचोड़ना चाहेंगे।

+6

यह केवल तभी काम करेगा जब फ़ील्ड के बीच केवल एक ही स्थान हो। – Scrutinizer

+3

यह सच है, @Scrutinizer, लेकिन अगर एक से अधिक थे तो हम पहले पाइप '| tr -s '' 'कई रिक्त स्थान हटाने के लिए। – fedorqui

+0

यदि आप रिक्त स्थान (डिलीमीटर) की संख्या एक रिकॉर्ड से दूसरे में भिन्न होते हैं तो आप इसे कैसे संभालेंगे? उदाहरण के लिए इसे 'ls -l' के आउटपुट में लागू करना? – gone

7

या awk

awk '{$1=$2=$3=$4=""; sub(/^ */,"", $0); print }' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

इसके अलावा के साथ, आप समाधान लगभग वहाँ है कर रहे हैं, तो आप सिर्फ एक '\ n' के लिए मजबूर करने की जरूरत है प्रत्येक संसाधित पंक्ति के अंत में मुद्रित करने के लिए, यानी

awk '{for(i=5;i<=NF;i++) {printf $i " "} ; printf "\n"}' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

ध्यान दें कि आपका BEGIN { " " } कोई ऑप नहीं है। और वर्तमान पुनरावृत्ति मान मुद्रित करने के लिए आपको $1 के बजाय $i का उपयोग करना चाहिए।

आईएचटीएच।

संपादित करें; Sudo_O आपत्ति को ध्यान में रखते हुए, मैंने डेटा में% s जोड़ा। यहाँ उत्पादन

This is line one 
This is line two 
This is line three 
T%shis is line four 

यह आप के लिए एक समस्या हो सकती है, तो यह उस मामले कैसे printf करने के लिए एक प्रारूप स्ट्रिंग पारित करने के लिए के बारे में पढ़ा है।

+2

आपको प्रारूप निर्दिष्ट किए बिना 'printf' का उपयोग नहीं करना चाहिए। उदाहरण के लिए यदि फ़ील्ड में '% s' है तो आपको क्या लगता है? –

+0

मैं sudo_O से सहमत हूं। आपको 'awk: printf (टी% shis) में पर्याप्त तर्क नहीं चाहिए उदाहरण के लिए .. – Scrutinizer

+1

मैं अपना आउटपुट बना रहा हूं। आप सभी को शुभकामनायें। – shellter

5

मैं जानता हूँ कि इस सवाल का बहुत पुराना है, लेकिन एक और awk उदाहरण:

awk '{print substr($0,index($0,$5))}' fileName 

यह क्या करता है: सूचकांक जहां मुद्रण ($ 5 में $ 0 के सूचकांक) शुरू करना चाहते हैं खोजने के लिए और के-स्ट्रिंग प्रिंट उस सूचकांक से $ 0 शुरू हो रहा है।

+1

पार्टी के लिए देर हो सकती है, लेकिन यह मेरे लिए बहुत अच्छा काम करता है। +1 =) – Terrance

0

awk '{gsub (/[[:digit:]]/,"");{$1=$1}}1' file

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