【问题标题】:Comparing column of two files比较两个文件的列
【发布时间】:2020-12-04 01:48:25
【问题描述】:

我想比较两个 csv 文件的第一列。我找到了this 答案并尝试对其进行最低限度的调整(我想要第一列,而不是第二列,并且我想要打印出任何不匹配的内容,无论该值是否存在于控制列中)。

我认为这是要走的路:

BEGIN { FS = "," } 
{
if(FNR==NR) {a[$1]=$1} 
else {if (a[$1] != $1) {print}}
}

[感谢 RavinderSingh13 的评论,这里我已经删除了一个语法错误]

第一行应该将分隔符设置为逗号。 只要我仍在阅读第一个文件,第二行就应该完全填充数组。 第三行是将第二个文件的第一列的元素按元素与所述数组进行比较。然后打印不匹配的整行。

但是,如果我将此应用于以下小文件,它们在第一个非标题条目中有所不同: 输出2.csv:

#ID,COU,YEA,VOT# 
4238,"CHN",2000,1
4239,"CHN",2000,1
4239,"CHN",2000,1
4240,"CHN",2000,1

和 output.csv:

#ID,COU,YEA,VOT# 
4237,"CHN",2000,1
4238,"CHN",2000,1
4239,"CHN",2000,1
4240,"CHN",2000,1

我没有打印出来。我这样称呼它:

ludi@ludi-M17xR4:~/Jason$ gawk -f compare_col_print_diff.awk output.csv output2.csv ludi@ludi-M17xR4:~/Jason$

【问题讨论】:

  • 你需要把{放在if之前,最后加上一个结尾}就可以了。我们只需要在 {...} 内调用 if 条件。
  • 是的,这消除了语法错误,但它没有按预期工作!但是非常感谢你!
  • 如果没有看到您的示例,就无法诚实地帮助逻辑部分,请添加示例并让我们知道,以便更好地理解您的问题。
  • @RavinderSingh13 当然!我将在一分钟内添加一个故障示例!非常感谢!
  • 如果您更改输入文件的顺序 (gawk -f compare_col_print_diff.awk output2.csv output.csv),您将在输出中看到 4237。或者说,output2 中的所有数字都存在于 output2 中,但并非 output 中的所有数字都存在于 output2 中。

标签: awk


【解决方案1】:

逐行比较,先匹配记录比较容易

$ paste -d, file1 file2 | awk -F, '$1!=(f=$(NF/2+1)){print NR":",$1, f}'

将打印第一个字段不一致的值。

使用您的输入文件,这将给出

2: 4238 4237
3: 4239 4238

【讨论】:

    【解决方案2】:

    Luuk 的评论让我意识到我原来的剧本中有一个巨大的根本性错误,我认为应该记录下来。说明

    a[$1]=$1
    

    不会每行生成一个数组条目,而是每个不同 ID 生成一个数组条目。因此,这样的数组不是对文件进行一般严格比较的基础。为了解决这个问题,我编写了以下内容,该示例适用于该示例,但可能仍包含陷阱,因为我仍在学习:

    BEGIN { FS = "," } 
    {
    if(FNR==NR) {a[NR]=$1} 
    else {if (a[FNR] != $1) {print FNR, $0}}
    } 
    

    制作:

    $ gawk -f compare_col_print_diff.awk output.csv output2.csv
    2 4238,"CHN",2000,1
    3 4239,"CHN",2000,1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多