csv - 如何将 csv 文件读入数组并与另一个 csv 文件中的条目进行比较和替换?

标签 csv awk sed

我有两个 csv 文件 file1.csvfile2.csv
file1.csv 包含 4 列。

文件1:

Header1,Header2,Header3,Header4
aaaaaaa,bbbbbbb,ccccccc,ddddddd
eeeeeee,fffffff,ggggggg,hhhhhhh
iiiiiii,jjjjjjj,kkkkkkk,lllllll
mmmmmmm,nnnnnnn,ooooooo,ppppppp

文件2:

"Header1","Header2","Header3"
"aaaaaaa","cat","dog"
"iiiiiii","doctor","engineer"
"mmmmmmm","sky","blue"

所以我想做的是逐行读取file1.csv,将每个条目放入一个数组中,然后将该数组的第一个元素与file2.csv的第一列进行比较 如果存在匹配项,则将 file1.csv 的 column1 和 column2 替换为 file2.csv 的相应列

所以我想要的输出是:

cat,dog,ccccccc,ddddddd
eeeeeee,fffffff,ggggggg,hhhhhhh
doctor,engineer,kkkkkkk,lllllll
sky,blue,ooooooo,ppppppp

当只有列需要替换时我可以做到这一点。
这是我的代码:

awk -F'"(,")?' '
NR==FNR { r[$2] = $3; next }
{ for (n in r) gsub(n,r[n]) } IGNORECASE=1' file2.csv file1.csv>output.csv

我的最后一步是将整个数组转储到一个包含 10 列的文件中。 有什么建议可以改进或更正我的代码吗?

最佳答案

编辑:考虑到您的Input_file2的日期为“ytest”,“test2”等格式,如果是,则尝试以下操作。(感谢Tiw在他/她的帖子中提供此示例)

awk '
BEGIN{
  FS=OFS=","
}
FNR==NR{
  gsub(/\"/,"")
  a[tolower($1)]=$0
  next
}
a[tolower($1)]{
  print a[tolower($1)],$NF
  next
}
1' file2.csv file1.csv
<小时/> <小时/>

您可以尝试以下操作吗?

awk '
BEGIN{
  FS=OFS=","
}
FNR==NR{
  a[$1]=$0
  next
}
a[$1]{
  print a[$1],$NF
  next
}
1'  Input_file2  Input_file1

或者,如果您可以在 Input_file(s) 中包含小写字母和大写字母的组合,请尝试以下操作。

awk '
BEGIN{
  FS=OFS=","
}
FNR==NR{
  a[tolower($1)]=$0
  next
}
a[tolower($1)]{
  print a[tolower($1)],$NF
  next
}
1'  Input_file2  Input_file1

关于csv - 如何将 csv 文件读入数组并与另一个 csv 文件中的条目进行比较和替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54284428/

相关文章:

python - 意外的 Python KeyError

shell - system() 产生不一致的结果

awk - 在最后一条记录之后使AWK中的记录分隔符不适用?

bash - sed - 删除破折号之前的所有字符

regex - 重复正则表达式模式

javascript - 从流中获取数据以供以后使用

java - 遍历 Java 中的字符串列表?

python - 使用 Python 读取存储在 FTP 中的 CSV 文件

linux - 如果 [ awk 'BEGIN{print 0.4*10}' > 1 -eq 0 ];然后回显是;菲

mysql - awk 从 csv 创建批量 MySQL 插入