我有一个文件,其中有一列名称重复多次。我想将每个重复压缩为一个,同时保留与其他同名重复不相邻的任何其他同名重复。
例如我想把左边转到右边:
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不重复)。
有没有办法为每个块保留唯一名称,同时保留在多个不相邻块中重复的名称?
uniq
将为您执行此操作:Awk
解决方案:输出:
试试这个 - 保存上一行并与当前行进行比较
你也标记
uniq
了 - 你试过了吗?使用sed可以如下完成:
在这里,我们在模式空间中随时都有 2 行。当它们之间的比较失败时,我们打印第一个并将其从前面切开,然后返回并将下一行附加到模式空间中。冲洗...重复
在 slurp 模式下使用Perl,我们将整个文件视为一个长字符串,在其上应用正则表达式,为您进行比较。
关于 Rakesh Sharma 的 sed 解决方案的问题。
如果您有一个输入文件,例如:
您希望输出文件为:
注意缺少的:
我知道我想要的命令类似于您的解决方案:
无法以正确的方式更改它以打印两列,并且只能使用第 2 列值以这种特殊方式进行排序。有小费吗?