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
)に追加してください。