一个非常简单的问题(我认为)
我正在学习使用awk
我想从文件中搜索所有线条并删除所有带有醋酸纤维素
的行我试过了
awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.txt
但是这会返回一个空的txt文件。
有什么建议吗?
答案 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:
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