awk:如果不满足条件则设置一个变量

时间:2020-04-23 10:16:01

标签: awk

我正在尝试删除所有具有重复的第一列条目并且第一列短于特定长度的行。我正在使用下面的代码。

awk -F':' '!seen[$1]++ && length($1)<=32' file-dup > file

测试示例:(这是通过将字符数匹配为10而不是32来完成的。)

输入:

a:123:addf
ab:123:addf
a:123:addf
abc:123:addf
akjsalkdjalkd123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
aop:123:addf
akijh:123:addf
akijhkjsladjslkajdlkad:123:addf

输出:

a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf

这基本上输出所有符合条件的行。
但是,不管所有行是否都符合条件,成功执行awk的返回代码始终为0。

我想知道文件中是否有任何行不符合条件或所有行都符合条件。就像输入如下所示时一样,我想返回一个不同的值或设置一些变量,因为没有一行满足条件。

a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf

我基本上可以检查原始文件和新文件的行号,并获得答案。但是

如果条件不匹配,是否可以返回不同的返回码,或者如果条件不满足,可以在awk自身内部设置变量?

2 个答案:

答案 0 :(得分:3)

尝试一下,但我没有测试:

awk -F':' '!seen[$1]++ && length($1)<=32{c++;print $0 > "file"}END{print NR==c}' file-dup
  • 使用print >重定向到目标文件(file
  • 命令返回1(所有行都符合条件)或0

您也可以不对awk命令进行任何更改,并触发第二个命令来比较两个文件(file和file-dup)以确定是否有一些行被滤除。

答案 1 :(得分:1)

最后使用AWK的退出指令来控制退出代码:

awk -F':' '{if (!seen[$1]++ && length($1)<=10) print; else r=1}END{exit r}' file-dup > file

演示:

$ awk -F':' '{if (!seen[$1]++ && length($1)<=10) print; else r=1}END{exit r}' file-dup && echo OK || echo KO
a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf
KO
$ awk -F':' '{if (!seen[$1]++ && length($1)<=10) print; else r=1}END{exit r}' file && echo OK || echo KO
a:123:addf
ab:123:addf
abc:123:addf
afj:123:addf
aki:123:addf
aop:123:addf
akijh:123:addf
OK