按列和总和计算角色

时间:2018-10-28 06:35:06

标签: awk

目的是检查输入文件的每一列是否包含完全相同的数字。与参考文件相比。

这是我发现检查文件格式是否具有完全相同的结构(按列进行相同挖掘)的方法

ref_file

1111 2222 333 4

文件

1266 2233 344 1
1122 3333 444 1
1111 2222 222 1
1112 2220 22  1
1111 2222 222
1111 2222 222 1

我尝试的代码。

dd=`awk ' {for(i=1;i<=NF;i++)$i=length($i)}NF' ref_file | awk '{ for(i=1; i<=NF;i++) j+=$i; print j; j=0 }'`

    awk ' {for(i=1;i<=NF;i++)$i=length($i)}NF' file |
      awk '{ for(i=1; i<=NF;i++) j+=$i; print $0" " j; j=0 }' |
       awk '{if($NF!~'$dd')print $0 " error"}' | wc -l | awk '{if($1>0) print "FILE FORMAT WRONG "}'

我相信有一种简单的方法。

使用我的代码。我对每一列的挖掘计数并对每一行求和,如果任何行的总数与总挖掘不匹配,则输入文件有错误。 IE,第4行和第5行。没有必要打印错误行。仅当至少一行与参考文件的结构不同时。show msg“文件格式错误”之类的。

预先感谢

3 个答案:

答案 0 :(得分:2)

这是我想出的(据我了解的问题):

awk 'NR==1{fields=NF
           for (i = 1; i <= fields; i++)
             cols[i]=length($i)
          }
     NR>1 { if(NF != fields)
              print "line "NR" has a different number of columns"
            else
              for (i = 1; i <= NF; i++)
                if(length($i) != cols[i])
                  print "column "i" in line "NR" has a different length"
          }' t

输出:

column 3 in line 4 has a different length
line 5 has a different number of columns

答案 1 :(得分:2)

类似于F. Knorr的回答,但使用ref_file

awk '
    NR == FNR { nf = NF; for (i=1; i<=NF; i++) len[i] = length($i); next }
    NF != nf { err = FNR; exit }
    { for (i=1; i<=NF; i++) if (len[i] != length($i)) { err = FNR; exit } }
    END { if (err) { print "invalid file format on line", err; exit 1 } }
' ref_file file

您的注释几乎是 :FILENAME是有效的awk变量,其中包含 current 文件的名称(取自给定的命令参数,或“- “如果awk正在从标准输入中读取)

END {
    if (err) {print "invalid file format on line", err; exit 1} 
    print "File format correct for :", FILENAME
}

答案 2 :(得分:1)

尝试一下:

awk 'NR == FNR {
  for (i=1; i<=NF; ++i) {
    a[i]=length($i)
  }
  next
}
{
  for (i=1; i<=NF; ++i) {
    if (length($i)!=a[i]) {
      printf("error at line %d, column %d.\n%s\n", FNR, i, $0)
      exit
    }
  }
}' ref_file file

输出:

error at line 4, column 3.
1112 2220 22  1