我正在尝试从文件中删除重复的行并更新文件.出于某种原因,我必须将其写入新文件并替换它.这是唯一的方法吗?
awk '!seen[$0]++' .gitignore > .gitignore
awk '!seen[$0]++' .gitignore > .gitignore_new && mv .gitignore_new .gitignore
Run Code Online (Sandbox Code Playgroud)
hek*_*mgl 11
重定向到与输入文件相同的输出文件,如:
awk '!seen[$0]++' .gitignore > .gitignore
Run Code Online (Sandbox Code Playgroud)
将以空文件结束.这是因为使用>运算符,shell将在命令执行之前打开并截断文件.这意味着你将丢失所有数据.
随着GNU较新版本的awk可以使用-i inplace选项来编辑文件到位:
awk -i inplace '!seen[$0]++' .gitignore
Run Code Online (Sandbox Code Playgroud)
如果您没有最新版本的GNU awk,则需要创建一个临时文件:
awk '!seen[$0]++' .gitignore > .gitignore.tmp
mv .gitignore.tmp .gitignore
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用以下sponge程序moreutils:
awk '!seen[$0]++' .gitignore | sponge .gitignore
Run Code Online (Sandbox Code Playgroud)
sponge将浸泡所有stdinput并在此之后打开输出文件.这有效地保持输入文件在写入之前保持不变.