合并两个csv文件/在shell中使用两个csv文件提取数据(使用awk)

时间:2019-11-06 06:27:16

标签: bash shell awk

我有两个CSV文件

csv 1:

a0,|a1|a2|a3|
b0,|b1|b2|b3|
c0,|c1|c2|c3|

csv 2:

a2,5
a3,7
c3,10
d6,3
b2,6

输出(可以不排序):

a0,a2(5);a3(7)
b0,b2(6)      
c0,c3(10)     
others,d6(3)  

我尝试使用grep并做到了。但我认为这将是冗长且耗时的。

#My tried code
while IFS= read -r line
do
  f=$(echo "$line" | cut -d, -f1)
  f1=$(echo "$line" | cut -d, -f2)
  echo "$(cat csv1.csv | grep "|$f|" | cut -d, -f1),$f($f1)" >> output
done < csv2.csv

输出我能够产生的东西

a0,a2(5) a0,a3(6) c0,c3(6)

有人可以帮助我实现shell脚本中预期的输出吗?

1 个答案:

答案 0 :(得分:0)

编辑: :由于OP更改了定界符,因此请立即添加此解决方案(使用所示示例进行编写和测试)。

awk '
FNR==NR{
  gsub(/^ +| +$/,"",$3)
  a[$1]=$2
  next
}
{
  num=split($2,array,"|")
}
{
  for(i=1;i<=num;i++){
    if(array[i] in a){
      val=(val?val ";":"")array[i] "(" a[array[i]] ")"
    }
  }
  $2=val
  val=""
}
1
' FS="," OFS="," file2 file1


请您尝试以下。

awk '
FNR==NR{
  gsub(/^ +| +$/,"",$3)
  a[$2]=$3
  next
}
FNR==1{
  print
  next
}
{
  num=split($3,array,",")
}
{
  for(i=1;i<=num;i++){
    if(array[i] in a){
      val=(val?val ",":"")array[i] "(" a[array[i]] ")"
    }
  }
  $3=val
  val=""
}
1
' FS="|" OFS="|"  Input_file2  Input_file1