AWK程序按行的行比较字段数

时间:2019-02-24 08:20:06

标签: unix awk

我正在尝试检查文件中每一行的长度(或字段数)是否相同。 我正在执行以下操作,但似乎无法正常工作。

NR==1 {length=NF}

NR>1 && NF!=length {print}

这可以通过单线awk完成吗?或程序很好。

输入示例为:

12 34 54 56
12 89 34 33
12
29 56 42 42

如果它们具有相同数量的字段,我的预期输出将是“是”或“否”。

5 个答案:

答案 0 :(得分:1)

我假设您要检查所有行的字段(如果相等),那么请尝试以下操作。

awk '
FNR==1{
  value=NF
  count++
  next
}
{
  count=NF==value?++count:count
}
END{
  if(count==FNR){
     print "All lines are of same fields"
}
  else{
     print "All lines are NOT of same fields."
  }
}
'  Input_file

其他内容(仅在需要时): :如果您要打印文件的内容,其所有行与yes或{输出中显示{1}}条消息,然后尝试执行以下操作。

all are same fields in file

答案 1 :(得分:1)

尝试:

awk 'BEGIN{a="yes"} last!="" && NF!=last{a="no"; exit} {last=NF}  END{print a}' file

工作原理

  • BEGIN{a="yes"}

    这会将变量a初始化为yes。 (我们假设所有行都具有相同的数字字段,除非另行证明。)

  • last!="" && NF!=last{a="no"; exit}

    如果为last分配了一个值,并且当前行上的字段数与上一行不同,则将a设置为no然后退出。

  • {last=NF}

    last更新为当前行中的字段数。

  • END{print a}

    退出之前,打印a

示例

$ cat file1
2 34 54 56
12 89 34 33
12
29 56 42 42
$ awk 'BEGIN{a="yes"} last!="" && NF!=last{a="no"; exit} {last=NF}  END{print a}' file1
no
$ cat file2
2 34 54 56
12 89 34 33
29 56 42 42
$ awk 'BEGIN{a="yes"} last!="" && NF!=last{a="no"; exit} {last=NF}  END{print a}' file2
yes

答案 2 :(得分:1)

您可以尝试执行以下命令,该命令检查每行中的字段数并将其与第一行中的字段数进行比较:

awk 'NR==1{a=NF; b=0} (NR>1 && NF!=a){print "No"; b=1; exit 1}END{if (b==0) print "Yes"}' test.txt

第一行中止检查,该行的字段数与输入的第一行不同。

输入

12 43 43
12 32

您将获得“否”

答案 3 :(得分:1)

这应该做

$ awk 'NR==1{p=NF} p!=NF{s=1; exit} END{print s?"No":"Yes"}' file

但是,如果将退出状态设置为工作流程的一部分,则设置退出状态会更好。

由于等价具有传递性,因此除第一行外无需保留NF;将0设置为成功值不需要初始化为默认值。

答案 4 :(得分:0)

高效的 e ven f ields shell函数,使用sed构造一个 regex (基于输入的第一行),以馈送到 GNU grep,寻找字段长度不匹配:

# Usage: ef filename
ef() { sed '1s/[^ ]*/[^ ]*/g;q' "$1" | grep -v -m 1 -q -f - "$1" \
       && echo no || echo yes ; }

对于字段不均匀的文件,grep -m 1在第一行不均匀行之后退出-因此,如果文件长一百万行,但是不匹配发生在#2行,则grep仅需要读了两行,而不是一百万。另一方面,如果没有不匹配的情况,grep将必须读取一百万行。