【问题标题】:Finding difference of values between corresponding fields in two CSV files查找两个 CSV 文件中对应字段之间的值差异
【发布时间】:2021-11-23 16:10:40
【问题描述】:

我一直试图找出两个 CSV 文件中对应字段之间的值差异

$ cat f1.csv
A,B,25,35,50
C,D,30,40,36
$
$ cat f2.csv
E,F,20,40,50
G,H,22,40,40
$

期望的输出:

5 -5 0   
8 0 -4

我可以这样实现:

$ paste -d "," f1.csv f2.csv
A,B,25,35,50,E,F,20,40,50
C,D,30,40,36,G,H,22,40,40
$
$ paste -d "," f1.csv f2.csv | awk -F, '{print $3-$8 " " $4-$9 " " $5-$10 }'
5 -5 0
8 0 -4
$

有没有更好的方法也可以单独使用 'awk' 来实现它,而不需要 'paste' 命令。

【问题讨论】:

  • 是的,但它使它更难以理解。
  • 每个文件可以多于2行吗?如果行数不匹配会发生什么情况(例如,f1.csv 有 3 行,f2.csv 有 1 或 8 行)?总会有 5 个逗号分隔的字段吗?我们会一直在比较字段#3、#4、#5,还是我们需要动态确定哪些字段是数字的?我们是否必须担心字段中的数字值与另一个文件的“匹配”字段中的非数字值?

标签: shell csv awk script


【解决方案1】:

作为第一步,仅将 paste 替换为 awk

awk -F ',' 'NR==FNR {file1[FNR]=$0; next} {print file1[FNR] FS $0}' f1.csv f2.csv

输出:

A,B,25,35,50,E,F,20,40,50 C,D,30,40,36,G,H,22,40,40

然后将file1[FNR] FS $0拆分为一个以,为字段分隔符的数组:

awk -F ',' 'NR==FNR {file1[FNR]=$0; next} {split(file1[FNR] FS $0, arr, FS); print arr[3]-arr[8], arr[4]-arr[9], arr[5]-arr[10]}' f1.csv f2.csv

输出:

5 -5 0 8 0 -4

来自man awk

FNR:当前输入文件中的输入记录号。

NR:目前看到的输入记录总数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2014-02-02
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多