我有两个 csv 文件 file1.csv
和 file2.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/