जाग में गतिशील नियमित अभिव्यक्ति
मेरे पास टेक्स्ट फाइलें हैं
1. पाठ
AA;00000;
BB;11111;
GG;22222;
2. पाठ
KK;WW;55555;11111;
KK;FF;ZZ;11111;
KK;RR;YY;11111;
मैं इस 3.txt उत्पादन उत्पन्न करते हैं
AA;00000;
BB;11111;KK;WW;55555;FF;ZZ;RR;YY
GG;22222;
इस .awk स्क्रिप्ट के साथ (मैं इसे cmd के साथ विंडोज में उपयोग करता हूं)
#!/usr/bin/awk -f
NR != FNR {
exit
}
{
printf "%s", $0 } /^BB/ { o = "" while (getline tmp < ARGV[2]) { n = split (tmp,arr,";") for (i=1; i<=n; i++) if(!match($0,arr[i]) && !match(o,arr[i]))
o=o arr[i]";"
}
printf "%s", o
}
{
print ""
}
उपयोग है awk -f script.awk 1.txt 2.txt
ठीक लगता है, लेकिन इस स्थिति पर विचार करें
1. पाठ
AA;BB;
2. पाठ
CC;DD;BB;AA;
अब इस तरह से बदलें
AAके साथ बदल दिया जाता d(2)
BBहै के साथ http://a.o/f/i.p?t=1
CCबदल दिया जाता है के Link
DDसाथ बदल दिया हैA_x-y.7z
स्क्रिप्ट 3.txt उत्पन्न नहीं कर सकती है
AA;BB;CC;DD;
या, प्रतिस्थापित पाठ का उपयोग करके यह 3.txt पाठ आउटपुट उत्पन्न नहीं कर सकता है
d(2);http://a.o/f/i.p?t=1;Link;A_x-y.7z;
आपको लगता है कि डुप्लिकेट क्षेत्रों की तरह देख सकते हैं AA, BB3.txt उत्पादन से हटा दिया जाता है, क्योंकि स्क्रिप्ट है कि रास्ते में काम करता है।
मुझे लगता है यह से कोई लेना देना नहीं है (...)एक regex में समूहन के रूप में लिया जा रहा match()के रूप में पहले पैरामीटर एक regex है और पास करके $0और ओ दोनों के रूप में "माना जाएगा गतिशील रेगुलर एक्सप्रेशन में * awkबात
जवाब
$ cat tst.awk BEGIN { FS=OFS=";" } { key = $(NF-1) }
NR == FNR {
for (i=1; i<(NF-1); i++) {
if ( !seen[key,$i]++ ) { map[key] = (key in map ? map[key] OFS : "") $i
}
}
next
}
{ print $0 map[key] }
$ awk -f tst.awk 2.txt 1.txt
AA;00000;
BB;11111;KK;WW;55555;FF;ZZ;RR;YY
GG;22222;
उपर्युक्त सिर्फ सरणी सूचकांकों के हैश लुकअप में शाब्दिक तार का उपयोग करता है ताकि यह परवाह न करें कि आपके इनपुट में आपके पास कौन से वर्ण हैं। आप चाहते हैं शाब्दिक तार तो regexp कार्य या ऑपरेटरों (जैसे प्रयोग नहीं करते के रूप में अपने इनपुट इलाज किया जाना है तो match(), ~, sub()उस पर), बस उपयोग स्ट्रिंग कार्य / ऑपरेटरों (जैसे index(), ==, substr(), in)।