我正在尝试检查文件中每一行的长度(或字段数)是否相同。 我正在执行以下操作,但似乎无法正常工作。
NR==1 {length=NF}
NR>1 && NF!=length {print}
这可以通过单线awk完成吗?或程序很好。
输入示例为:
12 34 54 56
12 89 34 33
12
29 56 42 42
如果它们具有相同数量的字段,我的预期输出将是“是”或“否”。
答案 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
将必须读取一百万行。