删除重复行并覆盖同一命令中的文件

Tho*_*ggi 3 bash awk

我正在尝试从文件中删除重复的行并更新文件.出于某种原因,我必须将其写入新文件并替换它.这是唯一的方法吗?

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并在此之后打开输出文件.这有效地保持输入文件在写入之前保持不变.


ama*_*ksr -2

是的,因为如果你不这样做,shell 甚至会在 awk 进程启动之前创建文件描述符并截断 .gitignore 。