逐列比较单独文件中的列

时间:2019-04-20 04:54:07

标签: awk

我试图逐列比较两个不同的文件,比如说“ file1”和“ file2” 两个文件中的字段$ 1和$ 2相同,如果一列中的任何值不同,则打印第1列和第2列以及发现不匹配的列号,als将打印在最后一列中找到的值,但出现行错误。 / p>

file1

36829.00  37145.00  10801  36840.00 36888.00  37146.00  37576 5 1 
36833.00  38033.00  21601  36840.00 36888.00  37602.00  38464 5 1
37265.00  38105.00  25921  36840.00 36900.00  37674.00  38536 6 2
37271.00  38885.00   8841  36840.00 36876.00  38454.00  38894 4 3

file2

36829.00  37145.00  10801  36840.00 36888.00  37146.00  37576 5 1
36833.00  38033.00  21601  36840.00 36888.00  37602.00  38464 3 1
37265.00  38105.00  25921  36840.00 36900.00  37674.00  38536 6 2
37271.00  38885.00   8840  36840.00 36876.00  38454.00  38894 4 3

Desired output

#中的不匹配(是该行中有错误的最后一列的值)

Mismatch in 1: 36833.00  38033.00 column 8
Mismatch in 3: 37271.00  38885.00 column 4

I tried

awk 'NR==FNR{a[$1,$2];next} ($1,$2) in a' file1 file2

预先感谢

3 个答案:

答案 0 :(得分:2)

以下是文件记录编号的匹配项:

    export class EducationalPostComponent extends Base2<EducationalPostService> {
      constructor(
        public title: Title,
        public router: Router,
        public toaster: ToasterService,
        private fb: FormBuilder
      ) {
        super(title, router, toaster);
         }
    }

输出:

awk '
NR == FNR {
    a[FNR] = $0                  # match on FNR, you could use a[$1, $2]
    next
}
{
    n = split(a[FNR], b, FS)
    for (i = 3; i <= n; i++) {
        if (b[i] != $i) {
            printf "Mismatch in %d: %s %s column %d\n", FNR, $1, $2, i
        }                        # for 0 starting record numbering use FNR-1 above
    }
}' file1 file2

答案 1 :(得分:1)

您能否请尝试以下操作(如果我正确地回答了您的问题,仅基于您的示例)。这也应该注意一行中的多个不匹配项(假设一行中有第3列和第5列不匹配项,它将同时打印这两个列)。

awk '
FNR==NR{
  a[FNR]=$0
  b[FNR]=$1 OFS $2
  next
}
{
  num=split(a[FNR],array," ")
  for(i=3;i<=num;i++){
     if($i!=array[i]){
        val=(val?val ",":"")i
     }
  }
  if(val){
     print "Mismatch in line" FNR": " b[FNR]" column(s) "val
     val=""
  }
}'   Input_file1  Input_file2

输出如下。

Mismatch in line2: 36833.00 38033.00 column(s) 8
Mismatch in line4: 37271.00 38885.00 column(s) 3

答案 2 :(得分:0)

尝试gnu awk:

awk 'NR==FNR{r[NR]=$0;next}{x=split(r[FNR],a);for(i=3;i<=9;i++){if($i!=a[i]) print "Mismatch in "a[9]": "$1,$2" column "i}}' file1 file2