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

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

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

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

Golgb1    Golgb1    
Golgb1    Akna
Golgb1    Spata20
Golgb1    Golgb1
Golgb1    Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna

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

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

答案1

uniq将为您执行此操作:

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna

答案2

Awk解决方案:

awk '$1 != name{ print }{ name = $1 }' file.txt

输出:

Golgb1
Akna
Spata20
Golgb1
Akna

答案3

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

$ perl -ne 'print if $p ne $_; $p=$_' ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

uniq您也已标记- 您尝试过吗?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

答案4

关于 Rakesh Sharma 的 sed 解决方案的问题。

如果您有一个输入文件,例如:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.118 48.216
-126.128 48.222
-126.136 48.226

您希望输出文件为:

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.128 48.222
-126.136 48.226

注意缺少的:

-126.118 48.216

我知道我想要的命令与您的解决方案类似:

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

无法以正确的方式更改它以打印两列,并且只能以这种特殊方式对第 2 列值进行排序。有小费吗?

相关内容