Awk 如何在bash中比较两个文本文件的行和列的值?

Awk 如何在bash中比较两个文本文件的行和列的值?,awk,Awk,我有两个文本文件,我想根据它们的行和列比较它们对应的值。通过比较,我的意思是检查值是否相等,以及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 ----------

我有两个文本文件,我想根据它们的行和列比较它们对应的值。通过比较,我的意思是检查值是否相等,以及
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中存在行3,但file2.txt中不存在行3,因此不需要进行比较)
  • 一次只能比较一行和一列
  • 必须使用
    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
FNR < 3 { next }  # if file record number < 3, go to next record
awk'NR>2

对于(i=2;i显然这是一个家庭作业问题,所以我将给你一些提示。你必须有一本awk书来阅读,在那里你可以学习细节

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

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

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

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
FNR < 3 { next }  # if file record number < 3, go to 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
    }
}
FNR<3{next}#如果文件记录编号<3,则转到下一个记录
NR==FNR{
#这里只处理第一个文件的记录
#将信息保存在关联数组中。
aa[$1]=。。。
下一张#继续下一张唱片
}
#如果规则没有模式,它将匹配每个记录
{
#这里只处理第二个文件的记录
如果(aa为1美元){
#比较字段
}
}

当然有很多限制条件……我会将此作为学术环境中的某种练习。你能展示你的预期输出吗?不,我没有。我只是不知道OP试图从这个问题中获得的确切输出是什么。