awk:如果条件不满足';见不到

awk:如果条件不满足';见不到,awk,Awk,我正在尝试删除所有第一列条目重复且第一列短于特定长度的行。我正在使用下面的代码 awk -F':' '!seen[$1]++ && length($1)<=32' file-dup > file 输出: 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

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

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

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
自身内部设置一个变量?

试试看,我没有测试:

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

您也可以不更改awk命令,并启动第二个命令来比较两个文件(文件和文件dup),以确定是否有一些行被过滤掉。

使用结尾处awk的exit指令来控制退出代码:

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)请您添加输入和预期输出的示例以澄清您的问题,请编辑您的帖子,然后让我们知道。@RavinderSingh13添加了测试示例。它按预期工作。在操作后,我们正在比较这两个文件。不是吗?有没有办法不重新打开文件,就可以完成?这很好,对我们来说很有效r较小的文件。但如果文件较大,则事后比较两个文件会产生额外的开销。不@RatDon,awk命令不会比较这两个文件,而是比较变量
c
文件dup
中的行数。明白。UNIX命令不会“返回”任何情况下,它们都会生成输出并设置退出状态。当前代码最终输出1或0,让它以状态1或0退出将更合适(
exit(NR==c)
exit(NR!=c)
,当结果意味着OP“成功”时,无论哪个代码生成了
0
可以只是
打印
,OP可以像通常那样将实际输出重定向到awk之外。