Awk 比较两个文本文件中的行和列的值时出现意外结果

Awk 比较两个文本文件中的行和列的值时出现意外结果,awk,scripting,comparison,Awk,Scripting,Comparison,这与我先前的一个问题有关: file1.txt(带有特殊字符:cat-vet file1.txt) file2.txt(带有特殊字符:cat-vet file2.txt) 我找到了一种比较两个文件的方法。但出于某种原因,它并没有给我想要的结果。下面是我用来比较文件的代码 awk ' FNR < 2 { next } FNR == NR { for (i = 2; i <= NF; i++) { a[i,$1] = $i; }

这与我先前的一个问题有关:

file1.txt(带有特殊字符:cat-vet file1.txt)

file2.txt(带有特殊字符:cat-vet file2.txt)

我找到了一种比较两个文件的方法。但出于某种原因,它并没有给我想要的结果。下面是我用来比较文件的代码

awk '
FNR < 2 { next }
FNR == NR {
    for (i = 2; i <= NF; i++) 
    {
        a[i,$1] = $i; 
    }    
    b[$1];
    next;

}
($1 in b) {
   for (i = 2; i <= NF; i++) 
   {
      if (a[i,$1] == $i) 
          printf("%s->Col%d: %d vs %d: Equal\n", $1, i-1, a[i,$1], $i);
      else 
          printf("%s->Col%d: %d vs %d: Not Equal\n", $1, i-1, a[i,$1], $i);
   }
} ' file1.txt file2.txt
实际结果:

row2->Col1: 1 vs 1: Equal
row2->Col2: 4 vs 4: Equal
row2->Col3: 0 vs 7: Not Equal
row1->Col1: 2 vs 2: Equal
row1->Col2: 5 vs 5: Equal
row1->Col3: 0 vs 999: Not Equal

有人知道为什么实际结果的第3行和第6行与0比较(不应该这样做)?

特别感谢@jaypal帮助我解决了这个问题。问题是这些文本文件是在MS-DOS中创建的,必须转换为Unix格式才能在Linux或Unix环境中执行。因此,在执行上述问题中的代码段之前,我必须使用以下命令:
dos2unix file1.txt

您的脚本在这里运行良好。加载文件1后,您可以打印出数组
a
中的所有元素,以查看是否一切正常。由于Kent已经声明此命令适用于给定的数据,您可能需要检查文件中的任何特殊字符。执行
cat-vet file1.txt
并用输出更新您的问题。@Nosscire这些是换行符的控制字符。您在windows环境中创建了这些文件。运行
dos2unix file1.txt
和类似的
file2.txt
并重新运行
awk
命令。@jaypal非常感谢它的工作+1.如果你提交答案,我会选择它。@Nosscire不客气。你也可以回答。只需添加转换文件所做的操作,并将其标记为已接受。
awk '
FNR < 2 { next }
FNR == NR {
    for (i = 2; i <= NF; i++) 
    {
        a[i,$1] = $i; 
    }    
    b[$1];
    next;

}
($1 in b) {
   for (i = 2; i <= NF; i++) 
   {
      if (a[i,$1] == $i) 
          printf("%s->Col%d: %d vs %d: Equal\n", $1, i-1, a[i,$1], $i);
      else 
          printf("%s->Col%d: %d vs %d: Not Equal\n", $1, i-1, a[i,$1], $i);
   }
} ' file1.txt file2.txt
row2->Col1: 1 vs 1: Equal
row2->Col2: 4 vs 4: Equal
row2->Col3: 7 vs 7: Equal
row1->Col1: 2 vs 2: Equal
row1->Col2: 5 vs 5: Equal
row1->Col3: 8 vs 999: Not Equal
row2->Col1: 1 vs 1: Equal
row2->Col2: 4 vs 4: Equal
row2->Col3: 0 vs 7: Not Equal
row1->Col1: 2 vs 2: Equal
row1->Col2: 5 vs 5: Equal
row1->Col3: 0 vs 999: Not Equal