在保持顺序的同时删除相邻的重复行

Age*_*e87 14 sed awk sort uniq

我有一个文件,其中一列的名称每列重复多次。我想将每个重复压缩为一个,同时保留与其他同名重复不相邻的任何其他同名重复。

例如,我想将左侧转到右侧:

Golgb1    Golgb1    
Golgb1    Akna
Golgb1    Spata20
Golgb1    Golgb1
Golgb1    Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna
Run Code Online (Sandbox Code Playgroud)

这是我一直在使用的:perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt 但是,这种方法只保留了左边的一个代表(即不重复 Golb1 和 Akna)。

有没有办法为每个块保留唯一名称,同时保留在多个非相邻块中重复的名称?

Dop*_*oti 24

uniq 会为你做这件事:

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna
Run Code Online (Sandbox Code Playgroud)

  • 哇,这太容易了!谢谢! (2认同)

Rom*_*est 10

Awk 解决方案:

awk '$1 != name{ print }{ name = $1 }' file.txt
Run Code Online (Sandbox Code Playgroud)

输出:

Golgb1
Akna
Spata20
Golgb1
Akna
Run Code Online (Sandbox Code Playgroud)


Sun*_*eep 6

试试这个 - 保存上一行并与当前行进行比较

$ perl -ne 'print if $p ne $_; $p=$_' ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna
Run Code Online (Sandbox Code Playgroud)

你也标记uniq了 - 你试过了吗?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna
Run Code Online (Sandbox Code Playgroud)