किसी विशिष्ट स्तंभ की सामग्री को awk से कैसे बदलें?


31

दिया गया: एक रिकॉर्ड में 40 कॉलम हैं। मैं 35 वें कॉलम को बदलना चाहता हूं ताकि 35 वें कॉलम को 35 वें कॉलम की सामग्री और "$" प्रतीक के साथ बदल दिया जाएगा। जो मन में आया वह कुछ इस तरह है:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

यह काम करता है लेकिन क्योंकि यह स्तंभ की संख्या 10k के रूप में बड़े होने पर संभव है। मुझे ऐसा करने के लिए एक बेहतर तरीका चाहिए।

जवाबों:



8

ऐसा करने के लिए शायद अधिक कुशल तरीके हैं। उस चेतावनी के साथ:

awk '{$35 = $35"$"; print}' infile > outfile

3

यदि फ़ील्ड सीमांकक है <space>:

sed 's/  */$&/35'

यदि फ़ील्ड सीमांकक अज्ञात है:sed 's/./$&/35'
अंडरले

@ उलटा - मुझे नहीं लगता कि वही बात है। कि इनपुट लाइन w / char $- सीमांकित या नहीं पर 35 वें वर्ण को उपसर्ग करना चाहिए । ऊपर की बात किसी भी संख्या के सीमांकक वर्ण की 35 वीं घटना को दूसरे शब्दों में व्यक्त करना चाहिए - दूसरे शब्दों में, 35 वां क्षेत्र - चार के साथ $- कोई फर्क नहीं पड़ता कि वर्ण प्रत्येक क्षेत्र में हैं।
mikeserv

आह, "एक रिकॉर्ड में 40 कॉलम"। मैंने '35 वाँ स्तंभ' को शाब्दिक रूप में 'पाठ फ़ाइल का 35 वां वर्ण स्तंभ' पढ़ा।
1

3

मूल फ़ील्ड-सेपरेटर को आरक्षित करने के लिए, मैंने ऐसा किया। मैं जिस कॉलम को खाली करना चाहता था वह नंबर $ 12 था।

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

साथ gawk -i, तुम्हारे पास है, तो आप जगह में फ़ाइल को संपादित कर सकते हैं।


1

"स्वीकृत" उत्तरों का उपयोग करके समस्याएँ थीं, यह फ़ाइल के पहले कॉलम से अधिक की जगह लेगा। मैं इस सामान्य आदेश का उपयोग करता हूं:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

कहा पे:

  • [column] = वह कॉलम जिसे आप 1 से शुरू करना चाहते हैं (0 नहीं)
  • [replace] = पाठ जिसे आप बदलना चाहते हैं

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... कुछ सेकंड में एक लाख टाइमस्टैम्प बदल दिया !! :)
रोबॉटिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.