根据条件删除整行

时间:2016-05-15 13:51:55

标签: awk sed

我有一个包含300个文件的文件夹。如果$ 2< = 25,我想从文件中删除行。如何直接从文件中删除行(就地编辑)?我的代码如下所示。

awk '{ for (i=1; i<=NF; i++) { if ($2 <= 25) next } print }' < *

ads 54.5    18  15.3    39.2
bdy 18.5    21  1.5     17.0
cst 36.8    22  27.7    9.1
hst 40.2    25  16.2    24.0
ads 18.9    41  5.0     13.2
bdy 20.5    45  67.0    19.0

1 个答案:

答案 0 :(得分:2)

你的脚本做得太多了。在我看来,最干净的解决方案是颠倒了这个条件:

awk '{ if ($2 > 25) print }'

甚至:

awk '$2 > 25'

如果您不想反转条件,那么:

awk '{ if ($2 <= 25) next; print }'

无需遍历所有字段。

甚至GNU awk都不支持“原位”文件修改。您必须将结果写入临时文件,然后将临时文件复制或移回原始文件。 (复制保留硬链接和权限;移动中断链接并可以修改所有者和权限。您需要确定是否存在问题。)

感谢Ed Morton指出GNU Awk 4.x确实有一种“原位”编辑文件的机制,部分原因是因为他竞选将其添加到其中。

命令行帮助不会告诉你GNU Awk 4.x支持文件的就地修改,但是如果你找到手册的正确部分(Extension sample: inplace - 这是错误的标题来自我的透视;它不仅仅是一个示例,因为它是一个分布式扩展)然后您可以发现有一个扩展使GNU Awk覆盖在其命令行上指定的常规文件。

gawk -i inplace '{ if ($2 > 25) print }' file1 …

甚至:

gawk -i inplace '$2 > 25' file1 …

请注意,实验表明,非常乐意在原位修改只读文件。这与sed(GNU和BSD(Mac OS X)子物种)一致;他们还会在没有警告的情况下就地修改只读文件 - 并保留文件的权限,但会破坏任何硬链接。

您的脚本使用awk '…' < *;这是忽略目录中第一个文件的一种特殊方法,除非它是目录中的唯一文件(它用于标准输入,但如果目录中有多个文件,则忽略标准输入)。您只需使用*,而不是< *