我有一个文件在第2列中有重复的值,需要重命名。有大约8k个重复值(在整个~5m行文件(with.duplicates).的文件list.of.duplicates)中
数据集输入:
with.duplicates
1 rs143225517 0 751756 C T
1个rs146277091 0 752478 A G
1个rs3094315 0 752566 G A
1个rs149886465 0 752617 A C
1 rs3131972 0 752721 A G
1 rs3131972 0 752721 AT G
1 rs3131971 0 752894 T C
1个rs61770173 0 753405 C A
1个rs2073814 0 753474 C G
1个rs2073813 0 753541 A G
1 rs12184325 0 754105 T C
list.of.duplicates
rs3131972
rs4310388
rs7529459
rs905135
rs9786995
rs12065710
rs6426404
rs12759849
rs6603823
我尝试过的代码
这就是我想要的--但是效率低下,而且只有一次替换
sed -i '0,/rs3131972/! s/rs3131972/qrs3131972/' with.duplicates
但是我想不出如何遍历整个重复值列表
i=0
while ((i++));
read -r snp
do
sed -i '0,/${snp}/! s/${snp}/q${snp}/' with.duplicates
done < list.of.duplicates
我在整个网站上都找到了部分答案,但没有一个能将所有内容整合到一个有效的脚本中。
提前感谢您的帮助!
寻找Linux或R中的解决方案
编辑:
所需的输出
1 rs143225517 0 751756 C T
1个rs146277091 0 752478 A G
1个rs3094315 0 752566 G A
1个rs149886465 0 752617 A C
1 rs3131972 0 752721 A G
1 qrs3131972 0 752721 AT G
1 rs3131971 0 752894 T C
1个rs61770173 0 753405 C A
1个rs2073814 0 753474 C G
1个rs2073813 0 753541 A G
1 rs12184325 0 754105 T C
发布于 2018-12-19 08:27:36
一种简单的方法是使用uniq
命令过滤第二个字段中的文件,并返回不唯一的行。
(如果重复项不在相邻行上,您将首先按第二个字段对文件进行排序,以确保它们在相邻行上)
给定inputs
中的数据,您可以使用以下命令报告非唯一行:
$ uniq -D -f1 -w10 inputs
1 rs3131972 0 752721 A G
1 rs3131972 0 752721 AT G
说明
虽然uniq
通常用于标识唯一值,但它也可以用于标识所有重复的值,例如
-D
打印所有重复的lines-f, --skip-fields=N
避免比较前N个fields-w, --check-chars=N
比较行数不超过N个字符(根据需要调整)组合这些选项将打印所有重复行,跳过第一个字段,仅比较从第二个字段开始的10个字符。
您可能需要将宽度调整一到两个,并调整覆盖整个输入文件所需的任何其他选项。如果重复行不是彼此相邻的,请不要忘记有关排序的注意事项。
https://stackoverflow.com/questions/53840154
复制相似问题