首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sed字符串的第二次出现-用于外部文件中的所有行(Linux)

sed字符串的第二次出现-用于外部文件中的所有行(Linux)
EN

Stack Overflow用户
提问于 2018-12-19 03:56:15
回答 1查看 124关注 0票数 0

我有一个文件在第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

我尝试过的代码

这就是我想要的--但是效率低下,而且只有一次替换

代码语言:javascript
复制
sed -i '0,/rs3131972/! s/rs3131972/qrs3131972/' with.duplicates

但是我想不出如何遍历整个重复值列表

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-12-19 08:27:36

一种简单的方法是使用uniq命令过滤第二个字段中的文件,并返回不唯一的行。

(如果重复项不在相邻行上,您将首先按第二个字段对文件进行排序,以确保它们在相邻行上)

给定inputs中的数据,您可以使用以下命令报告非唯一行:

代码语言:javascript
复制
$ 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个字符。

您可能需要将宽度调整一到两个,并调整覆盖整个输入文件所需的任何其他选项。如果重复行不是彼此相邻的,请不要忘记有关排序的注意事项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53840154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档