我似乎找不到一个命令可以让我删除文件中的重复项而不创建新文件并且保留文件中内容的顺序。
uniq
除了and之外还有其他命令吗awk
?
如果没有,我知道其中sed
包含一个就地选项。我只是不知道如何使用它来删除重复项。
有重复的sample.txt
1 2 1 3 4 1
删除重复的sample.txt
1 2 3 4
答案1
特别使用 GNU awk
,以及它最近获得的就地编辑能力,
$ cat file
1
2
1
3
4
1
$ awk -i inplace '!seen[$0]++' file
$ cat file
1
2
3
4
请注意,与大多数执行“就地编辑”(例如sed -i
)的工具一样,它使用临时文件来执行编辑。但是,您不必手动移动文件。
也可以看看:
答案2
如果命令中止,则存在损坏文件的风险:
{ awk '!seen[$0]++';
python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'; } <sample.txt 1<>sample.txt
我们在大括号内创建一组命令,将组的标准输入重定向到,sample.text
同时还sample.txt
通过1<>sample.txt
.
awk '!seen[$0]++'
是个awk 习惯用法用于删除重复项同时保持顺序
当awk
命令结束时,与标准输出相对应的文件描述符位于某个中间位置sample.txt
,sample.txt
需要截断到该位置。我能想到两种方法来实现这一点
python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'
python
如果安装的话是一个选项在 GNU Linux 系统上
truncate -s "$(awk '/^pos:/{print $2}' /proc/$$/fdinfo/1)" sample.txt
答案3
可以sort
与-o
sort -u sample.txt -o sample.txt
-u
是为了独特的
-o
用于输出文件名