你的脚本做得太多了。将干净的解决方案,我的脑海里,反转条件:
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 '…' < *
;这是忽略目录中第一个文件的独特方式,除非它是目录中的唯一文件(它用于标准输入,但如果目录中有多个文件,标准输入将被忽略)。您只需要使用*
,而不是< *
。
请参见:[删除所有第1列具有特定数字条目的行](http://stackoverflow.com/questions/22697636/delete-all-lines-where-column-1-has-specific-numeric-entries)和[awk保存修改inplace](http://stackoverflow.com/questions/16529716/awk-save-modifications-inplace) – Cyrus
我强烈建议你在尝试之前阅读由Arnold Robbins编写的Effective Awk编程第4版任何更多的文本操作,因为您对awk语法看起来很困惑(例如,循环遍历每次重复测试$ 2的所有字段)和调用(例如,试图从文件列表中使用输入重定向,并希望以某种方式更改awk不知道的文件中的值是否存在该重定向的礼貌)。 –