【问题标题】:merge two csv files/Extract data using two csv file in shell(using awk)合并两个 csv 文件/使用 shell 中的两个 csv 文件提取数据(使用 awk)
【发布时间】:2019-11-06 06:27:16
【问题描述】:

我有两个 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 脚本中预期的输出?

【问题讨论】:

  • 欢迎来到 SO,请在您的帖子中添加您的努力,然后让我们知道?你的文件| 也是分隔的吗?
  • @RavinderSingh13 对分隔符感到抱歉。我已经用我的努力更新了这篇文章。如果我们有大量数据,我的代码将花费很多时间。我可以有任何分隔符。在我生成数据时

标签: bash shell awk


【解决方案1】:

编辑: 由于 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

【讨论】:

  • @B100d,由于您更改了文件,所以我现在也添加了 EDIT 解决方案。
  • 如果输入字段包含嵌入的逗号(例如"a,2",5)或嵌入的换行符,它将不起作用。
  • @user1934428,我现在将在我的解决方案中添加公平警告,我也会尝试编辑这个极端情况,尽管 OP 没有提到它
  • 示例中OP没有,但他说输入​​是CSV。由此,我得出结论,它可能是任何有效的 CSV,包括多行字段。当 CSV 从电子表格程序中导出时,这些有时会出现。
  • @user1934428 我做了一些更改,它按预期工作。
猜你喜欢
  • 2013-04-22
  • 2020-11-22
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多