सुबह बख़ैर। लंबे समय तक पाठक, पहली बार ईमेल करने वाले कृपया विनम्र रहें।

मैं एईक्स 5.3 पर काम कर रहा हूं और इसमें 42 कॉलम पाइप सीमांकित फाइल है। कॉलम 15 और 16 (भूमि | मोबाइल) में टेलीफोन नंबर हैं जिनमें डेटा की कुंजी के आधार पर रिक्त स्थान हो सकते हैं या नहीं भी हो सकते हैं।

मुझे इन जगहों को केवल कॉलम 15 और 16 से हटाने की जरूरत है यानी

Column 15   |   Column 16 **Currently**
01942 665432|07865346122
01942756423 |07855 333567
Column 15   |   Column 16 **Needs to be**
01942665432|07865346122
01942756423|07855333567

मेरे पास एक त्वरित और गंदी स्क्रिप्ट है जो दुर्भाग्य से कुछ भी साबित हो रही है, लेकिन त्वरित है क्योंकि यह थोड़ी देर का लूप है जो हर एक लाइन को पढ़ रहा है, पाइप डिलीमीटर पर फ़ील्ड को काट रहा है, इसे एक वेरिएबल को असाइन कर रहा है, केवल स्ट्रिप के लिए कॉलम 15 और 16 पर sed का उपयोग कर रहा है। रिक्त स्थान फिर इसे एक नई फ़ाइल में लिखना अर्थात

cat $file | while read 

output

do

.....

fourteen=$( echo $output | cut -d'|' -f14 )

fifteen=$( echo $output | cut -d'|' -f15 | sed 's/ //g' )

echo ".....$fourteen|$fifteen..." > $new_file

done

मुझे पता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए, शायद एडब्ल्यूके का उपयोग करना, लेकिन किसी भी तरह के सुझाव के लिए खुला है जो कोई भी स्क्रिप्ट के रूप में पेश कर सकता है क्योंकि यह 176, 000 रिकॉर्ड को संसाधित करने में आधे घंटे से अधिक समय ले रहा है।

अग्रिम में धन्यवाद।

1
Darren_B 6 अक्टूबर 2017, 10:15

1 उत्तर

सबसे बढ़िया उत्तर

हां, awk यहां बेहतर अनुकूल है

$ cat ip.txt 
a|foo bar|01942 665432|07865346122|123
b|i j k |01942756423 |07855 333567|90870

$ awk 'BEGIN{FS=OFS="|"} {gsub(" ","",$3); gsub(" ","",$4)} 1' ip.txt 
a|foo bar|01942665432|07865346122|123
b|i j k |01942756423|07855333567|90870
  • BEGIN{FS=OFS="|"} | को इनपुट और आउटपुट फील्ड सेपरेटर के रूप में सेट करें
  • gsub(" ","",$3) सभी रिक्त स्थान को केवल कॉलम 3 के लिए कुछ भी नहीं से बदलें
  • gsub(" ","",$4) सभी रिक्त स्थान को केवल कॉलम 4 के लिए कुछ भी नहीं से बदलें
  • 1 इनपुट रिकॉर्ड को प्रिंट करने का मुहावरेदार तरीका (किसी भी संशोधन सहित)

3 और 4 को अपनी जरूरत के किसी भी क्षेत्र में बदलें


यदि पहली पंक्ति प्रभावित नहीं होनी चाहिए, तो एक शर्त जोड़ें

awk 'BEGIN{FS=OFS="|"} NR>1{gsub(" ","",$3); gsub(" ","",$4)} 1' ip.txt 
0
Sundeep 6 अक्टूबर 2017, 10:54
3
ओपी ने उद्देश्य में हेडर रिकॉर्ड में जगह छोड़ी हो भी सकती है और नहीं भी। आप इसे अपने अन्यथा सही उत्तर में संबोधित करना चाहेंगे?
 – 
James Brown
6 अक्टूबर 2017, 10:43
संदीप, तुमने मेरी जान बचाई!!!! यह पूरी तरह से काम करता है और रन टाइम को आश्चर्यजनक 4.8 सेकंड तक कम कर देता है !!! इसके लिए तो धन्यवाद भी कम है।
 – 
Darren_B
6 अक्टूबर 2017, 10:49
1
आपका स्वागत है... देखें जवाब मिलने पर क्या करें
 – 
Sundeep
6 अक्टूबर 2017, 10:55
1
यह केवल {print $0} या {print}... के लिए एक शॉर्टकट है, उदाहरण के लिए: जब आप awk 'NR==2' को फ़िल्टर करते हैं तो यह awk 'NR==2{print $0}'... NR==2 के लिए शॉर्टकट होता है। ..1 हमेशा सही स्थिति है, किसी भी मान का उपयोग कर सकते हैं जो सशर्त संदर्भ में सत्य का मूल्यांकन करता है
 – 
Sundeep
7 अक्टूबर 2017, 06:37
1
आह। मैं 'एनआर == 2' के बारे में जानता था... मैं अक्सर ऐसा करता हूं। बेशक: 1 हमेशा सच होगा। बहुत ही शांत!
 – 
pedz
7 अक्टूबर 2017, 17:12