一个非常简单的问题(我认为)
我正在学习编辑文件awk
我想从文件中搜索所有衬里并删除所有带有单词醋酸盐的行
我试过了
awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.txt
但是,这会返回一个空的 txt 文件。
有什么建议吗?
一个非常简单的问题(我认为)
我正在学习编辑文件awk
我想从文件中搜索所有衬里并删除所有带有单词醋酸盐的行
我试过了
awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.txt
但是,这会返回一个空的 txt 文件。
有什么建议吗?
尝试这样做:
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
看起来您在 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。
sputnick给出了比较完整的答案,我加了一个grep的方式:
grep -v 'acetate' file > newfile
perl -pi -e 'if(/acetate/){undef $_}' your_file
这将进行就地替换,这意味着文件中带有字符串“acetate”的行将被自动删除。或者你也可以这样做:
perl -pi -e 'undef $_ if /acetate/' your_file
或者
sed -i.bak '/acetate/d' temp
你的命令没问题,但你不能使用相同的文件作为输入和输出。您应该使用数据透视文件,然后移动它:
awk 'match($0,"acetate") == 0 {print $0}' filename.txt > filename.tmp<br>
mv -f filename.tmp filename.txt