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)
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)
试试这个 - 保存上一行并与当前行进行比较
$ 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)