【问题标题】:AWK - Replace between two csv files and print correctlyAWK - 在两个 csv 文件之间替换并正确打印
【发布时间】:2021-09-24 17:00:35
【问题描述】:

我有 2 个文件:

f1.csv:

CL*VIN AV*AZA PS*LUG

f2.csv:

2100-12-31*1234A*Thomas*Frederuc*1931-02-20*6791237*6791238*test1*1*0*0*CL*Jame 12*13*a1*zz3*D*13*1234*Tex*F 2100-12-31*1235A*Jack*Borbin*1931-02-21*7791238*7791239*test2*1*0*0*PS*威廉侯*14*a2*zz4*A*13*1235*Barc*F 2100-12-31*1236A*Pierce*Matheus*1931-02-22*8791239*8791240*test3*1*1*1*AV*Magnum st*15*a3*zz5*A*13*1236*Euo*F

我想要这个输出:

2100-12-31*1234A*Thomas*Frederuc*1931-02-20*6791237*6791238*test1*1*0*0*VIN*Jame 12*13*a1*zz3*D*13*1234*Tex*F 2100-12-31*1235A*Jack*Borbin*1931-02-21*7791238*7791239*test2*1*0*0*LUG*威廉侯*14*a2*zz4*A*13*1235*Barc*F 2100-12-31*1236A*Pierce*Matheus*1931-02-22*8791239*8791240*test3*1*1*1*AZA*Magnum st*15*a3*zz5*A*13*1236*Euo*F

我有以下代码:

awk -F"*" 'FNR==NR{ A[$1]=$2;next} ($12 in A){$12=A[$12];print}' OFS='*' f1.csv f2.csv

但是输出是:

*詹姆斯 12*13*a1*zz3*D*13*1234*Tex*F931-02-20*6791237*6791238*test1*1*0*0*VIN *威廉姆斯侯*14*a2*zz4*A*13*1235*Barc*F791238*7791239*test2*1*0*0*LUG *万能 st*15*a3*zz5*A*13*1236*Euo*F-02-22*8791239*8791240*test3*1*1*1*VIN

如何获得我想要的输出?

【问题讨论】:

  • 您的第一个文件是否具有 Windows 样式的 CRLF 行尾,并且您在使用 LF 行尾的系统上运行它?
  • 我用的是windows 10和wsl2,用dos2unix解决了问题

标签: awk


【解决方案1】:

您的代码在这里运行良好,您的系统/代码环境和awk 版本是什么?

这似乎与回车有关,所以最好在处理这些文件之前运行它:

dos2unix files

不过,你可以试试这个:

awk 'BEGIN{FS=OFS="*";RS="\r\n|\r|\n";}FNR==NR{A[$1]=$2;next}($12 in A){$12=A[$12];print}' f1.csv f2.csv 

【讨论】:

  • 我使用带有 wsl2 的 windows 10,你的 awk 代码有效,谢谢
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多