如果外部文件中存在值,则将数据添加到 CSV 中的行

Adding data to line in CSV if value exists in external file

这是我的示例数据:

1,32425,New Zealand,number,21004
1,32425,New Zealand,number,20522
1,32434,Australia,number,1542
1,32434,Australia,number,986
1,32434,Fiji,number,1

这是我的预期输出:

1,32425,New Zealand,number,21004,No
1,32425,New Zealand,number,20522,No
1,32434,Australia,number,1542,No
1,32434,Australia,number,986,No
1,32434,Fiji,number,1,Yes

基本上,我试图根据字段 3 是否包含在外部文件中来附加 Yes/No。这是我目前拥有的,但据我了解,grep 正在 while 循环中吃掉所有标准输入。因此,由于第一个值不包含在外部文件中,所以我只在每行的末尾添加了 No。

while IFS=, read -r type id country number volume
do
  if grep $country externalfile.csv
  then
    echo "${country}"
    sed 's/$/,Yes/' >> file2.csv
  else
    echo "${country}"
    sed 's/$/,No/' >> file2.csv
  fi
done < file1.csv

我在尝试排除故障时添加了 echo“${country}”,这就是我发现它只解析第一行的原因。

试试这个:

while read -r line
do
country=`echo $line | cut -d',' -f3`
if grep "$country" externalfile.csv
then
        echo "$line,Yes" >> file2.csv
else
        echo "$line,No" >> file2.csv
fi
done < test.txt

您需要将$country放在"中,因为有些国家可能包含多个单词。比如新西兰。您还可以使用 cut 命令更轻松地设置 country 变量。

假设没有headers-

 awk -F, 'NR==FNR{lookup[]=; next;}
   { if ( lookup[] ==  ) { print [=10=] ",Yes" } else { print [=10=] ",No" } }
         ' externalfile.csv file2.csv

这将一次解析两个文件。

如果你只是喜欢纯粹的bash

declare -A lookup
while read c; do lookup["$c"]="$c"; done < externalfile.csv

declare -p lookup # this is just to show you what my example loaded
declare -A lookup='([USA]="USA" [Fiji]="Fiji" )'

while IFS=, read a b c d; do 
  [[ -n "${lookup[$c]}" ]] && echo "$a,$b,$c,$d,Yes" || echo "$a,$b,$c,$d,No"
done < file2.csv
1,32425,New Zealand,number,21004,No
1,32425,New Zealand,number,20522,No
1,32434,Australia,number,1542,No
1,32434,Australia,number,986,No
1,32434,Fiji,number,1,Yes

不需要grep

awk -F, -v OFS=, 'NR == FNR { ++a[]; next } { $(++NF) =  in a ? "Yes" : "No" } 1' externalfile.csv file2.csv