0

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

我正在学习编辑文件awk

我想从文件中搜索所有衬里并删除所有带有单词醋酸盐的行

我试过了

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

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

有什么建议吗?

4

5 回答 5

9

尝试这样做:

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
于 2013-01-30T23:05:56.213 回答
3

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

command file > file

其中“command”是任何 UNIX 命令,在“command file”读取之前,您将面临“file”被“> file”覆盖的风险,因此永远不要这样做。

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

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

command file > tmp && mv tmp file

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

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

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

对于更复杂的事情,您可能需要 awk。

于 2013-01-31T01:22:19.077 回答
2

sputnick给出了比较完整的答案,我加了一个grep的方式:

grep -v 'acetate' file > newfile
于 2013-01-30T23:33:47.450 回答
2
perl -pi -e 'if(/acetate/){undef $_}' your_file

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

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

或者

sed -i.bak '/acetate/d' temp
于 2013-01-31T09:28:07.933 回答
1

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

awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.tmp<br>
mv -f filename.tmp filename.txt
于 2015-12-09T19:24:57.870 回答