2013-12-15 6 views
30

मैं अग्रणी और input.txt नीचे के 2 कॉलम में अंतरिक्ष अनुगामी दूर करने के लिए कोशिश कर रहा हूँ में एक स्ट्रिंग से पीछे के स्पेस:ट्रिम प्रमुख और awk

Name, Order  
Trim, working
cat,cat1

मैं का इस्तेमाल किया है दूसरे कॉलम में अग्रणी और पिछली जगह को हटाने के लिए awk से नीचे लेकिन यह काम नहीं कर रहा है। मैं क्या खो रहा हूँ?

Name, Order  
Trim, working
cat,cat1

अग्रणी और पीछे वाले स्पेस नहीं निकाले जाते:

awk -F, '{$2=$2};1' input.txt 

इस रूप में उत्पादन देता है।

उत्तर

39

आप सभी रिक्त स्थान, केवल लाइनों एक अल्पविराम है कि में ट्रिम, और awk उपयोग करना चाहते हैं, तो निम्न आप के लिए काम करेंगे:

awk -F, '/,/{gsub(/ /, "", $0); print} ' input.txt 

आप केवल दूसरे कॉलम में रिक्त स्थान को निकालना चाहते हैं , के लिए

awk -F, '/,/{gsub(/ /, "", $2); print$1","$2} ' input.txt 

नोट अभिव्यक्ति बदल कि gsub दूसरी अभिव्यक्ति के साथ // में चरित्र विकल्प, चर कि तीसरे पैरामीटर है में - और इतने in-place है - ओ में थर्म शब्द, जब यह हो जाता है, $0 (या $2) संशोधित किया गया है।

पूर्ण विवरण:

-F,   use comma as field separator 
       (so the thing before the first comma is $1, etc) 
/,/   operate only on lines with a comma 
       (this means empty lines are skipped) 
gsub(a,b,c) match the regular expression a, replace it with b, 
       and do all this with the contents of c 
print$1","$2 print the contents of field 1, a comma, then field 2 
input.txt  use input.txt as the source of lines to process 

संपादित मैं कहना चाहता हूँ कि @ बीएमडब्ल्यू समाधान बेहतर है, के रूप में यह वास्तव में ट्रिम केवल प्रमुख और लगातार दो gsub आदेशों के साथ रिक्त स्थान अनुगामी। क्रेडिट देने के दौरान मैं यह बताता हूं कि यह कैसे काम करता है।

gsub(/^[ \t]+/,"",$2); - starting at the beginning (^) replace all (+ = zero or more, greedy) 
          consecutive tabs and spaces with an empty string 
gsub(/[ \t]+$/,"",$2)} - do the same, but now for all space up to the end of string ($) 
1       - ="true". Shorthand for "use default action", which is print $0 
          - that is, print the entire (modified) line 
+0

क्या आप इसे समझा सकते हैं। – Marjer

+2

एक 'gsub' समाधान के लिए @ एडमोर्टन के उत्तर को देखें। यह अंतरिक्ष के लिए चरित्र वर्ग का भी उपयोग करता है जो करने के लिए एक बेहतर चीज है। – codeforester

11

मैं sed का प्रयोग करेंगे:

sed 's/, /,/' input.txt 

यह , के बाद अग्रणी स्थान पर निकाल देंगे। आउटपुट:

Name,Order 
Trim,working 
cat,cat1 

अधिक सामान्य निम्नलिखित, यह , के बाद संभवतः कई रिक्त स्थान और/या टैब निकाल देंगे हो सकता है:

sed 's/,[ \t]\?/,/g' input.txt 

यह भी वजह से दो से अधिक स्तंभों के साथ काम करेंगे वैश्विक संशोधक /g


@Floris एक समाधान है कि अनुगामी और और समाप्त होने को हटा के लिए चर्चा में पूछा प्रत्येक colum में व्हाइटस्पेस (यहां तक ​​कि प्रथम और अंतिम), जबकि नहीं एक स्तंभ के बीच में सफेद रिक्त स्थान को हटाने:

sed 's/[ \t]\?,[ \t]\?/,/g; s/^[ \t]\+//g; s/[ \t]\+$//g' 

IMO sed इस काम के लिए इष्टतम उपकरण है। हालांकि, यहां awk के साथ एक समाधान आता है क्योंकि आप उस के लिए अनुरोध किया है:

cat input.txt | tr -d ' ' 
+0

मुझे नहीं लगता कि आपका वर्तमान 'अजीब' समाधान _trailing_ रिक्त स्थान हटा देता है ...? – Floris

+0

जबकि मेरे उत्तर में मुख्य बिंदु यह दिखाने के लिए है कि 'sed' इस नौकरी के लिए अजीब से बेहतर है - क्योंकि यह एक टेक्स्ट संपादन कार्य है,' awk' स्क्रिप्ट काम करना चाहिए। मैंने इसका परीक्षण किया है। उसमे गलत क्या है? – hek2mgl

+0

आपका 'sed' कमांड पीछे की जगहों को हटाने के लिए प्रकट नहीं होता है। बस अंत में '> output.txt' डालें, परिणाम को एक टेक्स्ट एडिटर में खोलें और आप देखेंगे ... – Floris

0

सरल समाधान है:

awk -F', ' '{printf "%s,%s\n", $1, $2}' input.txt 

एक और सरल उपाय है कि मन में आता है सब व्हाइटस्पेस दूर करने के लिए tr -d है शायद tr

$ cat -A input 
^I Name, ^IOrder $ 
    Trim, working $ 
cat,cat1^I 

$ tr -d '[:blank:]' < input | cat -A 
Name,Order$ 
Trim,working$ 
cat,cat1 
+1

अच्छा और कॉम्पैक्ट। क्या आप इसे संशोधित कर सकते हैं ताकि यह केवल दूसरे कॉलम (प्रश्न के अनुसार) ट्रिम कर सके? – Floris

24

का उपयोग करने के लिए अग्रणी और एक gsub द्वारा 2 स्तंभ

awk 'BEGIN{FS=OFS=","}{gsub(/^[ \t]+/,"",$2);gsub(/[ \t]+$/,"",$2)}1' input.txt 

किसी अन्य तरीके से सफेद स्थान अनुगामी निकालें:

awk -F',[[:blank:]]*' '{$2=$2}1' OFS="," input.txt 
+0

मुझे पसंद है कि आप '^' और '$' एंकरों का उपयोग करके दो अलग-अलग 'gsub' आदेशों में केवल प्रमुख और पिछली जगहों को कैसे हटा रहे हैं। अधिक जटिल, लेकिन पैसे पर। – Floris

+1

मैं बस इसे सीधे सोचता हूं, और गंज रिक्ज़ – BMW

+1

के लिए विस्तृत स्पष्टीकरण के लिए धन्यवाद, जो आपने किया (या मेरी प्रतिलिपि) के बारे में अपनी व्याख्या लिखकर अपने उत्तर को बेहतर बनाने के लिए स्वतंत्र महसूस करें। मुझे लगता है कि आपका उत्तर स्वीकार किया जाना चाहिए - लेकिन जब यह "पूर्ण" होता है तो यह हमेशा बेहतर होता है। – Floris

1

निम्नलिखित काम करने के लिए लगता है कॉलम दो में रिक्त स्थान का केवल एक सेट (जो मूल उदाहरण है):

awk '{print $1$2}' /tmp/input.txt

कोई अन्य फ़ील्ड जोड़ना, उदा। awk '{print $1$2$3}' /tmp/input.txt रिक्त स्थान के दो सेट (कॉलम दो में तीन शब्द तक) पकड़ेंगे, और कम होने पर तोड़ नहीं पाएंगे।

यदि आपके पास स्पेस सीमांकित शब्दों की एक अनिश्चित (बड़ी) संख्या है, तो मैं पिछले सुझावों में से एक का उपयोग करता हूं, अन्यथा यह समाधान सबसे आसान है जिसे आप अजीब का उपयोग कर पाएंगे।

0

यदि यह मान लेना सुरक्षित है:

awk 'BEGIN{FS=OFS=","} {gsub(/^[ \t]+|[ \t]+$/, "", $2)}1' infile 
9

मैं बस इस पर आया था। सही उत्तर है:

awk 'BEGIN{FS=OFS=","} {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$2)} 1'