删除行awk

时间:2013-01-30 23:04:42

标签: awk

一个非常简单的问题(我认为)

我正在学习使用awk

编辑文件

我想从文件中搜索所有线条并删除所有带有醋酸纤维素

的行

我试过了

awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.txt

但是这会返回一个空的txt文件。

有什么建议吗?

5 个答案:

答案 0 :(得分:8)

尝试这样做:

awk '!/acetate/{print}' filename.txt > new_filename.txt &&
mv new_filename.txt filename.txt

或简单地说:

awk '!/acetate/' filename.txt > new_filename.txt &&
mv new_filename.txt filename.txt

您无法使用awk同时打印和修改文件。如果您想要在同一命令中执行此操作,请尝试使用

sed -i '/acetate/d' filename.txt

或Mac Os X:

sed -i.'' '/acetate/d' filename.txt

答案 1 :(得分:3)

perl -pi -e 'if(/acetate/){undef $_}' your_file

这将进行就地替换,意味着文件中带有字符串'acetate'的行将被自动删除。 或者你也可以这样做:

perl -pi -e 'undef $_ if /acetate/' your_file

sed -i.bak '/acetate/d' temp

答案 2 :(得分:2)

sputnick给出了一个相对完整的答案,我加上一个grep方式:

grep -v 'acetate' file > newfile

答案 3 :(得分:2)

看起来你在UNIX上。当你这样做时:

command file > file

其中“command”是任何UNIX命令,在“命令文件”读取之前,“/ gt;文件”会覆盖“file”的风险,所以永远不要这样做。

某些工具(如“sed”)具有允许“就地”编辑的选项,因此在输入文件上运行该命令的结果将写回该文件。他们中的大多数人在幕后使用临时文件。

将命令结果写回文件的安全,可移植的方法只是将输出重定向到tmp文件,然后将临时文件移动到原始文件:

command file > tmp && mv tmp file

安全,简单,适用于任何命令。

对于只查找文件中不包含特定单词的行的特定情况,您可能需要的命令是“grep”,您可以将其用作:

grep -v acetate filename.txt > tmp && mv tmp filename.txt

对于任何更复杂的事情,你可能都想要awk。

答案 4 :(得分:0)

您的命令没问题,但您无法使用相同的文件作为输入和输出。您应该使用数据透视文件,然后移动它:

awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.tmp<br>
mv -f filename.tmp filename.txt