Bash 使用分隔符检查文本文件中字段的长度

Bash 使用分隔符检查文本文件中字段的长度,bash,Bash,我的目标是检查文本文件每行第三个字段的长度。第三个字段必须是一个8个字符的数字字符串,在输出中,我希望第三个字段的长度与8不同,并且不是数字 例如: Terry;18;44123456;yes Mark;19;44098711;no Sandy;19;4411897090;no Tom;17;4413;no 输出: Sandy;19;4411897090;no Tom;17;4412;no 我试过: awk -F, '{if(length($3) == 8 ) print }' 但我无法

我的目标是检查文本文件每行第三个字段的长度。第三个字段必须是一个8个字符的数字字符串,在输出中,我希望第三个字段的长度与8不同,并且不是数字

例如:

Terry;18;44123456;yes
Mark;19;44098711;no
Sandy;19;4411897090;no
Tom;17;4413;no
输出:

Sandy;19;4411897090;no
Tom;17;4412;no
我试过:

awk -F, '{if(length($3) == 8 ) print }' 
但我无法实现我的目标。我应该如何进行

解决方案:

awk -F, '{if(length($3) != 8 ) print }'

谢谢大家帮助我。到目前为止,更好的社区是

您的命令使用逗号作为FS-F,您的示例使用分号作为分隔符

第三个字段包含八个字符的行

awk -F\; 'length($3) == 8'
awk -F\; 'length($3) != 8'
第三个字段不是八个字符的行

awk -F\; 'length($3) == 8'
awk -F\; 'length($3) != 8'
第三个字段不是八个字符或第三个字段不是整数的行

awk -F\; 'length($3) != 8 || $3 + 0 != $3'

您的命令使用逗号作为FS-F,您的示例使用分号作为分隔符

第三个字段包含八个字符的行

awk -F\; 'length($3) == 8'
awk -F\; 'length($3) != 8'
第三个字段不是八个字符的行

awk -F\; 'length($3) == 8'
awk -F\; 'length($3) != 8'
第三个字段不是八个字符或第三个字段不是整数的行

awk -F\; 'length($3) != 8 || $3 + 0 != $3'

这行不通,你得逃出去

awk -F\; '{if(length($3) == 8 ) print }'

这行不通,你得逃出去

awk -F\; '{if(length($3) == 8 ) print }'
awk的字段分隔符-F应为;不可以,

awk的字段分隔符-F应该是;不,

您可以使用好的旧grep,因为它适用于此类工作:

grep '[^;]\+;[^;]\+;[[:digit:]]\{8\}' file
。。。或者更简单:

egrep '[^;]+;[^;]+;[[:digit:]]{8}' file
或:

您可以使用good old grep,因为它适用于此类工作:

grep '[^;]\+;[^;]\+;[[:digit:]]\{8\}' file
。。。或者更简单:

egrep '[^;]+;[^;]+;[[:digit:]]{8}' file
或:

只是:

print和ifstatement可以省略。

只需:

print和ifstatement可以省略。

使用grep:

使用grep:


为什么要匹配文本+?不应该是吗?@Barmar grep正在使用基本的POSIX正则表达式。当用作量词时,+需要转义。@Barmar但是感谢对的提示,它应该是;:。。是打字错误。@user2302636如果还没有过滤输出,工作意味着什么?我没有收到你的评论。您希望输出应该是什么样子?为什么要匹配literal+?不应该是吗?@Barmar grep正在使用基本的POSIX正则表达式。当用作量词时,+需要转义。@Barmar但是感谢对的提示,它应该是;:。。是打字错误。@user2302636如果还没有过滤输出,工作意味着什么?我没有收到你的评论。您希望输出应该是什么样子?没有Tom字段;17;4412;否是长度8,但是否应包含在输出中?哈?你的样本输出与你所说的正好相反。你说你想要字段3是8个字符的行,但是输出是不是8个字符的行;17;4412;否是长度8,但是否应包含在输出中?哈?你的样本输出与你所说的正好相反。您说您想要字段3为8个字符的行,但输出的行不是8个字符。感谢您改进我的选择!但是我怎样才能用错误的行过滤输出呢?只要否定这个条件,请参阅我的ed回答。谢谢改进我的选择!但是我怎样才能用错误的行过滤输出呢?只要否定这个条件,看看我的答案