किसी विशिष्ट स्तंभ की सामग्री को 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.