एक पाठ फ़ाइल मान लें जिसमें वैकल्पिक रेखाएँ हों। विशेष रूप से, प्रत्येक पंक्ति जोड़ी की पंक्ति 1 "#" से शुरू होती है, जबकि प्रत्येक पंक्ति जोड़ी की अगली पंक्ति में एक अल्फ़ान्यूमेरिक स्ट्रिंग होती है।

$ cat file
#Foo
1234567
#Bar
1234
#Baz
123456789

मैं प्रत्येक पंक्ति जोड़ी की पंक्ति 2 (साथ ही एक कीवर्ड) की लंबाई को पंक्ति 1 में स्वचालित रूप से कैसे जोड़ूं? मेरा मानना ​​है कि awk ऐसे ऑपरेशन के लिए सही विकल्प है।

$ awk 'desired code' file
#Foo_Length7
1234567
#Bar_Length4
1234
#Baz_Length9
123456789

यहाँ मेरी कोशिश है, लेकिन मैं यह नहीं समझ सकता कि length($0) को किसके साथ प्रतिस्थापित किया जाए:

awk '{if ($1~/^#/) print $0"_Length"length($0); else print $0}' file
3
Michael G 26 अगस्त 2020, 22:20

3 जवाब

सबसे बढ़िया उत्तर
$ awk '!(NR%2){print prev "_Length" length($0) ORS $0} {prev=$0}' file
#Foo_Length7
1234567
#Bar_Length4
1234
#Baz_Length9
123456789

आप चाहें तो !(NR%2) को !/^#/ या इससे मिलते-जुलते से बदल सकते हैं।

3
Ed Morton 26 अगस्त 2020, 22:35

क्या आप कृपया अनुसरण करने का प्रयास कर सकते हैं। यहां tac + awk संयोजन का उपयोग करना। मोबाइल पर लिखा हुआ यह परीक्षण नहीं कर सका, फिर भी काम करना चाहिए।

tac Input_file | 
awk '
NR%2!=0{
  len=length($0)
  print
  next
}
{
  print $0"_Length"len
  len=""
}' | 
tac

स्पष्टीकरण: सबसे पहले tac का उपयोग करके आउटपुट को उल्टा प्रिंट करें जिससे हमें आसानी से डेटा हेरफेर से निपटने में मदद मिलेगी। फिर awk के साथ हर विषम संख्या में लाइन प्रिंट करती है और इसकी लंबाई len वेरिएबल में लेती है। फिर हर सम लाइन पर पिछली लाइन की लंबाई के साथ करंट लाइन को प्रिंट करना। एक बार इसकी प्रोसेसिंग के साथ awk हो जाने के बाद फिर से tac का उपयोग करके इसे वास्तविक प्रारूप में बनाने के लिए Input_file को उलट दिया जाता है।

1
RavinderSingh13 26 अगस्त 2020, 22:45

जीएनयू awk के साथ:

awk '{first=$0; getline; print first "_length" length($0); print}' file

आउटपुट:

#Foo_length7
1234567
#Bar_length4
1234
#Baz_length9
123456789

man awk से:

getline: अगले इनपुट रिकॉर्ड से $0 सेट करें; एनएफ, एनआर, एफएनआर, आरटी सेट करें।

2
Cyrus 26 अगस्त 2020, 22:25