टैब ने मूल्यों को जागृत कर दिया


90

मैं TAB अलग स्ट्रिंग से पहला कॉलम कैसे चुनूँ?

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'

उपरोक्त पूरी लाइन वापस कर देगा और न केवल "LOAD_SETTLED" जैसा कि अपेक्षित था।

अपडेट करें:

मुझे टैब अलग मूल्यों में तीसरे कॉलम को बदलने की आवश्यकता है। निम्नलिखित काम नहीं करता है।

echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt

हालाँकि यह अपेक्षा के अनुसार काम करता है यदि विभाजक टैब के बजाय अल्पविराम है।

echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt

4
awk 'BEGIN {FS = "[\ t] +"}; {प्रिंट $ 1} '# यह वही है जो मैं ढूंढ रहा था। क्या मेरी Google खोज सही है? :)
शांतनुओ

3
इस टिप्पणी के लिए धन्यवाद, मुझे पता चला है: awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txtपहले तीन कॉलमों के टैब-सीमांकित मूल्यों को प्रिंट करने के लिए।
वोक

6
या शायद बसawk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
जोशिया योडर

3
जीएनयू और बीएसडी दोनों -vचर स्थापित करने के लिए समर्थन जगाते हैं । यह इनलाइन प्रोग्राम केBEGIN {FS="\t"} अंदर उपयोग करने के लिए बदसूरत है , और आपके द्वारा किए जाने वाले किसी भी खुले स्रोत के योगदान पर आपत्ति की संभावना है। केवल तभी करें यदि आप एक प्रोग्राम फ़ाइल लिख रहे हैं । इसके अलावा, इसका उपयोग करने के लिए हतोत्साहित किया जाता है क्योंकि उत्तरार्द्ध स्पष्ट करता है कि केवल सेट किया जा रहा है और नहीं । उस अंतिम बिंदु के बारे में भ्रम जो इस पोस्ट को पहले स्थान पर पहुंचाता है। इसलिए "अच्छी शैली" महत्वपूर्ण है। -F-v FS=FSOFS
ब्रूनो ब्रोंस्की

1
कृपया, किसी को भी, कभी भी, क्या नहीं करना चाहिए आप अपने आउटपुट में [इनपुट] फील्ड सेपरेटर की गणना न करें। आप OFSचर के माध्यम से आउटपुट फ़ील्ड विभाजक निर्दिष्ट करते हैं।
ब्रूनो ब्रोंस्की

जवाबों:


141

आपको OFSटैब बनने के लिए चर (आउटपुट फ़ील्ड सेपरेटर) सेट करने की आवश्यकता है :

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'

(सुनिश्चित करें कि आप $lineइको स्टेटमेंट में वैरिएबल को उद्धृत करते हैं )


6
$ '\ T' में $ का उद्देश्य क्या है?
अम्रत मुस्तफा

10
उन्नत बैश स्क्रिप्टिंग गाइड से मेरे अपने प्रश्न का उत्तर देते हुए: $ '...' उद्धृत स्ट्रिंग-विस्तार निर्माण एक तंत्र है जो बच गए ऑक्टल या हेक्स मूल्यों का उपयोग करता है ..., उदाहरण के लिए, उद्धरण = $ '\ 042'।
अम्रत मुस्तफा

5
@AmrMostafa, गाइड एक भ्रामक व्याख्या एक प्रमुख को लगता है कि आप ऐसा नहीं है बहुत बुरा है कि $में $'\t'जरूरत नहीं है। ग्रेग की विकी बेहतर है: "इनमें से, $'...'सबसे आम है, और केवल सिंगल कोट्स की तरह काम करता है सिवाय इसके कि बैकस्लैश-एस्कैप्ड संयोजनों को एएनएसआई सी मानक द्वारा निर्दिष्ट के रूप में विस्तारित किया जाता है"।
क्रिस्टियन सियुपिटु

9
अड़चन में, $'\t'जरूरी नहीं है। awk स्ट्रिंग "\t"को एक टैब कैरेक्टर समझता है
ग्लेन जैकमैन

5
मुक्त स्रोत योगदानकर्ता, मैं आपसे विनती करता हूं, कृपया सामान जमा न करें awk -F $'\t' 'BEGIN {OFS = FS} …'। वह होना चाहिए awk -v FS='\t' -v OFS='\t' '…'। यह पांडित्यपूर्ण लग सकता है, लेकिन असंगत होने की संभावना बढ़ जाती है कि बाद में योगदानकर्ता बग का परिचय देगा क्योंकि वे आपके कोड को गलत समझते हैं।
ब्रूनो ब्रोंस्की

21

सुनिश्चित करें कि वे वास्तव में टैब हैं! बैश में, आप एक टैब का उपयोग करके सम्मिलित कर सकते हैंC-v TAB

$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED


9

मैं BIND ज़ोन फ़ाइलों को हेरफेर करने के लिए FSऔर OFSचर का उपयोग करता हूं जो टैब सीमांकित हैं। यहाँ मेरी एक स्क्रिप्ट https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39 है

इसका मांस है:

awk -v FS='\t' -v OFS='\t' \
    -v record_type=$record_type \
    -v hostname=$hostname \
    -v ip_address=$ip_address '
$1==hostname && $3==record_type {$4=ip_address}
{print}
' $zone_file > $temp

यह ऐसा करने का एक साफ और आसान तरीका है।


5
echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'

0

क्या यह काम नहीं करना चाहिए?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.