我有一个文件,其中有一列,每个列的名称重复多次。我想将每个重复压缩为一个,同时保留与其他同名重复不相邻的任何其他同名重复。
例如我想将左侧转到右侧:
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 列值进行排序。有小费吗?