2016-05-15 70 views
0

我有一个包含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

请参见:[删除所有第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

+1

我强烈建议你在尝试之前阅读由Arnold Robbins编写的Effective Awk编程第4版任何更多的文本操作,因为您对awk语法看起来很困惑(例如,循环遍历每次重复测试$ 2的所有字段)和调用(例如,试图从文件列表中使用输入重定向,并希望以某种方式更改awk不知道的文件中的值是否存在该重定向的礼貌)。 –

回答

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 '…' < *;这是忽略目录中第一个文件的独特方式,除非它是目录中的唯一文件(它用于标准输入,但如果目录中有多个文件,标准输入将被忽略)。您只需要使用*,而不是< *