検索と置換を使用したデータの更新

検索と置換を使用したデータの更新
get_data.txt
ald900  NON-Prod        GOOG037-A   US
ald9024 NON-Prod        GOOG037-A   SRI-LANKA
ald978  NON-Prod        GOOG037-A   JAPAN

2つの与えられたデータがあります。 get_data.txtで検索し、resultant.txtで更新する必要があります。 get_data.txtからデータを取得できますが、resultant.txtでは更新できません。

resultant.txt
ald900.google.com   #N/A    #N/A
ald978.vci.google.com   #N/A    0
ald9024.google.com  #N/A    #N/A

サンプルコード

while read ln
  do
  cat get_data.txt |grep $ln |awk '{print $4}'
done < cat resultant.txt | cut -d "." -f1

これにより更新する値を取得できますが、resultant.txtで#N/A & 0を使用して "cat get_data.txt |grep $ln |awk '{print $4}'" 結果を更新するにはどうすればよいですか。

この結果が必要です。

resultant.txt
ald900.google.com   #N/A    US
ald978.vci.google.com   #N/A    JAPAN
ald9024.google.com  #N/A    SRI-LANKA

答え1

awkに行く:

awk 'NR==FNR{a[$1]=$NF;next}{split($1,arr,/\./);$NF=a[arr[1]]}1' get_data.txt resultant.txt > tmpfile
mv tmpfile resultant.txt

出力:

ald900.google.com #N/A US
ald978.vci.google.com #N/A JAPAN
ald9024.google.com #N/A SRI-LANKA

awkは何してるの?

awk '
    NR==FNR{
        a[$1]=$NF           #Array `a` stores last fields of get_data.txt using the 1st fields as keys
        next
    } 
    {
        split($1,arr,/\./)  #Split 1st field of resultant.txt on the dots
        $NF=a[arr[1]]       #Retrieve the corresponding element in a and replace the last field with it
    }
    1                       #Print the resulting line
' get_data.txt resultant.txt

注:出力ファイルをタブで区切るには、-v OFS='\t'awk(awk -v OFS='\t' '...' get_data.txt resultant.txt > tmpfile)に追加してください。

関連情報