我有一个文件在第2列中有重复值,需要重命名。在整个~5m行文件(带.duplicates)中有~8k个重复值(在文件列表.of.duplicates中)。
数据集输入:
带.副本
1件rs143225517 0 751756 C T
1个rs146277091 0 752478 A G
1 rs3094315 0 752566克
1 rs149886465 0 752617空调
1个rs3131972 0 752721 A G
1台rs3131972 0 752721 AT G
1 rs3131971 0 752894温度
1号rs61770173 0 753405 C A
1 rs2073814 0 753474克
1个rs2073813 0 753541 A G
1 rs12184325 0 754105温度
副本列表
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克
1 rs149886465 0 752617空调
1个rs3131972 0 752721 A G
G处1 qrs3131972 0 752721
1 rs3131971 0 752894温度
1号rs61770173 0 753405 C A
1 rs2073814 0 753474克
1个rs2073813 0 753541 A G
1 rs12184325 0 754105温度

最佳答案

好吧,awk可以自己处理。你不需要循环。

awk '(FNR==NR) { d[$1]; next }
     ($2 in d) && !(++d[$2]-2) { $2 = "q" $2; delete a[$2] }
     1' list.of.duplicates with.duplicates

是否可以修改为,而不是将“q”添加到第二个引用的第二列,将q添加到较长行的第二列?
可以,但这不会像上面那样有效。
awk '(ARGIND==1) { d[$1]; next }
     (ARGIND==2) {
         if ($2 in d) {
             if ($2 in r) { if (length(r[$2]) > length()) d[$2]++; delete r[$2] }
             else { r[$2] = $0 }
         } next }
     ($2 in d) && !(++d[$2]-2) { $2 = "q" $2; delete d[$2] }
     1' list.of.duplicates with.duplicates with.duplicates

关于linux - sed字符串的第二次出现-适用于外部文件中的所有行(Linux),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53840154/

10-11 15:26