【问题标题】:How to compare values of rows and columns of two text files in bash?如何在bash中比较两个文本文件的行和列的值?
【发布时间】:2014-06-19 05:40:26
【问题描述】:

我有两个文本文件,我想根据它们的行和列比较它们的对应值。通过比较,我的意思是检查值是否相等,echo 值是否相同。以下是文件:

file1.txt

Name  Col1  Col2  Col3  
-----------------------
row1  1     4     7        
row2  2     5     8         
row3  3     6     9   

file2.txt

Name  Col1  Col2  Col3  
-----------------------
row2  1     4     11        
row1  2     5     12           

以下是限制条件:

  • 只比较存在的行(即:由于file1.txt中存在row3,而file2.txt中不存在,所以不需要比较)
  • 必须一次进行一行和一列的比较。
  • 必须使用awk
  • 文件中的行可能乱序

我在想这样的事情:

awk 'NR>2
    for (i=2;i<NR;i++)              #for each row of file1.txt
    {     
        for(j=1;i<NF;j++)           #for each column of file1.txt
        {
             // check if row and column of file1.txt is equal to row and column of file2.txt
        } 
    }

' file1.txt file2.txt

我是 bash 的初学者,所以请原谅我的所有错误。这样的事情可能吗?另外,您如何比较两个不同文本文件的值?谢谢。如果需要更多解释,请告诉我。

【问题讨论】:

  • 当然有很多限制...我会将其用作学术环境中的某种练习。
  • 你能显示你的预期输出吗?
  • 不,我不是。我只是无法弄清楚 OP 试图从这个问题中得到什么确切的输出。

标签: awk


【解决方案1】:

显然,这是一个家庭作业问题,所以我只是给你一些提示。您必须有一本 awk 书才能阅读,您可以在其中了解详细信息。

您尝试使用 NR 的方式不正确。不是总记录数,而是当前记录数。

请记住,awk 脚本是一个规则列表,每个规则的格式为pattern {actions}。所以你的程序应该尽可能地采用这种形式。 awk 的基本机制是读取一条记录,依次针对每个规则的模式对其进行测试,如果它匹配一个模式,则执行相关的操作,当它到达规则的末尾时继续下一条记录。它是“数据驱动的”,与 C 或 Java 等语言非常不同。

您可以使用如下初始规则跳过两个文件的前两行:

FNR < 3 { next }  # if file record number < 3, go to next record

有一种惯用的方式来处理两个文件。 NR == FNR 仅在第一个文件中为真,因为 NR(记录号)在文件之间不断增加,而 FNR(文件记录号)在文件之间重置。所以你可以这样做:

NR == FNR {
    # Only the first file's records will be processed here

    next  # go on to the next record
}

在处理第一个文件时,您需要使用关联数组来保存由第一个字段作为键的记录。

最终规则将只处理第二个文件,测试第一个字段是否是关联数组中的键,如果是,则比较其他字段以查看它们是否匹配。

所以你的程序可能有这样的结构:

FNR < 3 { next }  # if file record number < 3, go to next record

NR == FNR {
    # Only the first file's records will be processed here

    # Save info in an associative array.
    aa[$1] = ...

    next  # go on to the next record
}

# If a rule has no pattern, it matches every record
{
    # Only the second file's records will be processed here

    if ($1 in aa) {
        # compare fields
    }
}

【讨论】:

    猜你喜欢
    • 2022-10-18
    • 2018-04-17
    • 2014-11-11
    • 2014-08-10
    • 1970-01-01
    • 2014-03-03
    • 2018-12-28
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多