AWK:如何删除不包含特定模式的某些行?

AWK:如何删除不包含特定模式的某些行?

我有一个文件,其中包含带有各种字母数字字符串的行,这些字符串以空格-破折号-空格分隔。但是,有些行仅存在一个字母数字值和分隔符,但缺少另一个字符串值。例子:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
DK0060056323-DKK -
DK0060186294-DKK -

上面示例中的最后两行在分隔符的右侧缺少字母数字字符串,我想删除它们。我尝试使用以下 awk 表达式:

awk '!/* - /' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

我的!/* - /意思是“查找在任何字符(*)之后有一个空格-破折号-空格(-)并且之后没有任何内容的模式,如果没有找到这样的模式(!)”,则将其余行移至临时。 txt 文件,并将 sourcefile.txt 内容替换为 temp.txt 内容。但是,当我运行上面的 awk 脚本时,sourcefile.txt 内容没有任何反应 - 一切都保持不变。我也没有收到任何错误。这里可能出了什么问题?鉴于上述示例行,运行 awk 脚本后所需的输出应如下所示:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

答案1

要打印以字母数字字符结尾的行很简单:

$ awk '/[[:alnum:]]$/' file
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

答案2

更简单:

awk '$3' inputfile

这是 的简写awk '$3!=""',这是 的简写awk '$3!=""{print}',这是 的简写awk '$3!=""{print $0}'

作为记录:

sed /-$/d可能更快,grep -ve '-$'甚至更快。

答案3

感谢@guillermo chamorro的建议,我能够通过以下方式修改我的脚本来实现所需的输出:

awk '!/^.* -$/' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

谢谢吉列尔莫。

相关内容