为什么我的命令给出错误的输出?

为什么我的命令给出错误的输出?

如果 col 1 有数字值,我试图输出行,但它不起作用。我的示例文件在第 1 列中没有数字,因此 awk 在这种情况下不应该返回任何内容吗?

我的代码

awk -F 'BEGIN {OFS=FS}{ if ( ( $2 ~/aaa/ || $2 ~/bbb/ || $2~/ccc/) && $1 ~ "[[:digit:]]$")print}' file

猫文件

8F3FTO|aaa|278346|
TYF98|bbb|89237|
YUG198|ccc|29834|
aljs23456|ccc|241298|

我的代码返回

aljs23456|ccc|241298

答案1

除非这是复制粘贴错误,否则您实际上并未指定|为字段分隔符。你应该用过-F'|'.

此外,所有四个输入行在第 1 列中都有一个或多个数字。它们在第 1 列中还包含非数字。如果您想匹配 $1 仅包含数字的行,请使用^[[:digit:]]+$

顺便说一句,您可以对脚本进行很多优化。例如

awk -F'|' 'BEGIN {OFS=FS}; $2 ~ /aaa|bbb|ccc/ && $1 ~ "^[[:digit:]]+$"' file

您不需要,if因为 awk 语句通常采用以下形式pattern {action}(两者都是可选的)。不带模式的操作会对所有输入行执行,不带操作的模式print会对所有匹配行执行(print 是模式评估为 true 时的默认操作,这就是为什么该语句1是一个完整的语句,并且是常见的惯用同义词{print}- “1”评估为 true,因此print执行默认操作)。

或者,如果您希望以 2 美元的价格精确匹配 aaa、bbb 或 ccc(即与aaab或 之类的内容不匹配foocccbar):

awk -F'|' 'BEGIN {OFS=FS}; $2 ~ /^(aaa|bbb|ccc)$/ && $1 ~ "^[[:digit:]]+$"' file

相关内容