मैं एक फ़ाइल को बदलने पर काम कर रहा हूं जिसमें रिक्त स्थान और अल्पविराम दोनों के साथ एकाधिक नाम मान जोड़े हैं।

मेरी इनपुट फ़ाइल में सर्वर का नाम, संस्करण संख्या और क्षेत्र हैं (ए, बी, सी, डी) एक सर्वर कई क्षेत्रों का हिस्सा हो सकता है।

मेरी इनपुट फ़ाइल इस तरह है।

  Servername1  3.0 A,B,C,D
  Servername2  3.0 A
  Servername3  3.0 B
  Servername4  1.0 B,C

मैं अपनी इनपुट फ़ाइल को नीचे की तरह कनवर्ट करना चाहता हूं। यदि मेरा सर्वर एकाधिक क्षेत्रों का हिस्सा है, तो मुझे इसके लिए सर्वर नाम और संस्करण को उपसर्ग करने के लिए एक अलग प्रविष्टि बनानी होगी।

  Servername1  3.0 A
  Servername1  3.0 B
  Servername1  3.0 C
  Servername1  3.0 D
  Servername2  3.0 A
  Servername3  3.0 B
  Servername4  1.0 B
  Servername4  1.0 C

क्या आप कृपया सुझाव दे सकते हैं?

0
Moonrunner 17 सितंबर 2020, 02:38

2 जवाब

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

सामान्य स्थिति में आप एक फ़ाइल पर awk का उपयोग करते हैं जहां:

  • एक क्षेत्र विभाजक मौजूद है (यहां: डिफ़ॉल्ट स्थान)।
  • एक कॉलम में दूसरे डिलीमीटर द्वारा अलग किए गए मान हैं (यहां: अल्पविराम)।
  • और आप इन मानों का इलाज करना चाहते हैं जैसे कि वे फ़ील्ड थे (यहां: ए, बी, सी, डी)

तब आप split() फ़ंक्शन का उपयोग कर सकते हैं। यह एक विभाजक का उपयोग करके एक स्ट्रिंग को एक सरणी में विभाजित करता है। इसके अलावा कि आप इन मानों को a[1] से शुरू करके सरणी तत्वों के रूप में एक्सेस कर सकते हैं।

awk '{ split($3,a,","); for (i=1;i<=length(a);i++) {$3=a[i]; print} }' file

आउटपुट:

Servername1 3.0 A
Servername1 3.0 B
Servername1 3.0 C
Servername1 3.0 D
Servername2 3.0 A
Servername3 3.0 B
Servername4 1.0 B
Servername4 1.0 C
1
thanasisp 17 सितंबर 2020, 03:26

यह आपके लिए काम कर सकता है (GNU sed):

sed -E 's/^((.* )[^,]*),/\1\n\2/;P;D' file

सूची के सामने वाले हिस्से को अपने आप बदलें, एक नई लाइन और सूची के सामने वाले हिस्से को कम करके जो हिस्सा बदलता है। सूची के सामने प्रिंट/हटाएं और दोहराएं।

0
potong 17 सितंबर 2020, 11:15