删除文件中的重复行而不在ubuntu中创建新文件

删除文件中的重复行而不在ubuntu中创建新文件

我似乎找不到一个命令可以让我删除文件中的重复项而不创建新文件并且保留文件中内容的顺序。

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.txtsample.txt需要截断到该位置。我能想到两种方法来实现这一点

  1. python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'python如果安装的话是一个选项

  2. 在 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用于输出文件名

相关内容