我有一个包含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
答案 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 '…' < *
;这是忽略目录中第一个文件的一种特殊方法,除非它是目录中的唯一文件(它用于标准输入,但如果目录中有多个文件,则忽略标准输入)。您只需使用*
,而不是< *
。