Awk - दो फाइलों के बीच मैच का मान

Dec 28 2020

मेरे पास दो फाइलें हैं जिनकी मैं तुलना करने की कोशिश कर रहा हूं, और उन दोनों फाइलों से मौजूद डेटा के साथ एक अंतिम.txt फाइल बना सकता हूं।

File1 - कॉलम 1 और File2 - कॉलम 2 में वह मूल्य है जो मुझे दो फाइलों के बीच मेल करने की आवश्यकता है।

इसलिए अनिवार्य रूप से, मैं कोशिश कर रहा हूं कि File1 से कॉलम 1 ले लूं, अगर फाइल 2 के कॉलम 2 में कोई मेल है, तो फाइल को टाइप 1 करें, फाइल 1 को टाइप 2 करें और फाइल 2 को टाइप 1 करें।

उदाहरण

फ़ाइल 1

1000,Brian
1010,Jason
400,Nick

फाइल 2

3044 "1000"
4466 "400"
1206 "1010"

आउटपुट फ़ाइल जैसा दिखता है

1000,Brian,3044
1010,Jason,1206
400,Nick,4466

मेरा परीक्षा कोड कोई परिणाम नहीं दिखा रहा है

awk -F"[,]" 'NR==FNR{a[$1]=$1","$2;next} ($2 in a){print a[$2]","$1}' file1.txt file2.txt

मेरा मानना ​​है कि मुझे इसे जागृत करने में सक्षम होना चाहिए, लेकिन किसी कारण से मैं वास्तव में इस एक के साथ संघर्ष कर रहा हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा।

धन्यवाद

जवाब

2 RavinderSingh13 Dec 28 2020 at 00:58

क्या आप GNU में अपने दिखाए गए नमूनों के साथ निम्नलिखित लिखित और परीक्षण का प्रयास कर सकते हैं awk

awk '
FNR==NR{
  gsub(/"/,"",$2) arr[$2]=$1 next } FNR==1{ FS="," OFS="," $0=$0 } ($1 in arr){
  print $0,arr[$1]
}
'  Input_file2  Input_file1

स्पष्टीकरण: ऊपर के लिए विस्तृत विवरण जोड़ना।

awk '                ##Starting awk program from here.
FNR==NR{             ##Checking condition FNR==NR which will be TRUE when Input_file1 is being read.
  gsub(/"/,"",$2) ##globally substituting " in 2nd field with NULL. arr[$2]=$1 ##Creating array arr with index of 2nd field and value of 1st field. next ##next will skip all further statements from here. } FNR==1{ ##Checking condition if this is first line of Input_file1. FS="," ##Setting FS as comma here. OFS="," ##Setting OFS as comma here. $0=$0 ##Reassigning current line to itself so that field separator values will be implemented to current line. } ($1 in arr){         ##Checking condition if 1st field is present in arr then do following.
  print $0,arr[$1]   ##Printing current line and value of array arr.
}
' file2 file1        ##Mentioning Input_file names here.
EdMorton Dec 28 2020 at 05:09

आपने अपने इनपुट इनपुट / आउटपुट में 2 इनपुट फ़ाइलों के बीच मेल खाने वाली कोई भी रेखाएँ शामिल नहीं की हैं, इसलिए यह उन मामलों के लिए जो आप चाहते हैं या नहीं कर सकते हैं:

$ cat tst.awk BEGIN { FS="[[:space:]\",]+"; OFS="," } NR==FNR { map[$2] = $1 next } { print $0, map[$1] }

$ awk -f tst.awk file2 file1
1000,Brian,3044
1010,Jason,1206
400,Nick,4466