根据逗号将行拆分为多行:一行解决方案

3
我可以帮您翻译,以下是翻译结果:

我想将以下格式拆分为独立行

输入:

17:79412041:C:T,CGGATGTCAT
17:79412059:C:G,T
17:79412138:G:A,C
17:79412192:C:G,T,A

期望的输出

17:79412041:C:T
17:79412041:C:CGGATGTCAT
17:79412059:C:G
17:79412059:C:T
17:79412138:G:A
17:79412138:G:C
17:79412192:C:G
17:79412192:C:T
17:79412192:C:A

基本上将输入拆分为唯一行或firstID:secondID:thirdID:FourthID。这里可能有多行具有相同的firstID:secondID:thirdID,而FourthID是使每一行唯一的ID(在输入中用“,”分隔)。

提前感谢 Shams


2
新手入门编程,请参考https://stackoverflow.com/tags/awk/info和https://stackoverflow.com/tags/sed/info。本论坛不提供免费编码服务,请参阅https://stackoverflow.com/help/asking。 - undefined
在这里,很少有什么事情能像坚持解决方案必须是“一行代码”一样,能够引起常客们厌恶的表情。如果对你来说,在一行代码上尽可能地塞入尽量多的字符是重要的话,那你确实还有很多东西需要学习。 - undefined
@Sundeep,我已经编辑了我的帖子,“你的问题部分”,我猜这可能会让你高兴!(不要太个人化)。而且我猜你的陈述可能会侮辱那些在这篇文章下面提出了很棒解决方案的酷哥们,因为你花时间找怨言来抱怨我提问的方式!... - undefined
这不是抱怨,而是我提出的一些建议,希望能帮到你。你可以选择查看那些链接或者忽略它们,由你决定。 - undefined
5个回答

1

这里的一行代码:

$ awk -F':' '{ split($4,a,","); for (i in a) { print $1":"$2":"$3":"a[i] } }' data.txt

产生:

17:79412041:C:T
17:79412041:C:CGGATGTCAT
17:79412059:C:G
17:79412059:C:T
17:79412138:G:A
17:79412138:G:C
17:79412192:C:G
17:79412192:C:T
17:79412192:C:A

解释:

split(string, array, delimiter)

将字符串按分隔符分割,并将每个部分保存到数组中。

for-in循环只是打印数组中的每个部分,前三个条目。

-F':' 部分定义了顶层分隔符。


如果存在第二列需要与之一起打印的情况,是否有任何解决方法? - undefined
17:79412041:C:T,CGGATGTCAT pass;no_artifact 17:79412059:C:G,T pass;no_artifact 17:79412138:G:A,C fail;low_cov 17:79412192:C:G,T,A pass;high_mapq - undefined
使用上述命令,它只打印最后一个分割的内容:17:79412041:C:T 17:79412041:C:CGGATGTCAT 通过;无伪迹 17:79412059:C:G 17:79412059:C:T 通过;无伪迹 17:79412138:G:A 17:79412138:G:C 失败;低覆盖率 17:79412192:C:G 17:79412192:C:T 17:79412192:C:A 通过;高映射质量 - undefined

1
一行命令的awk
$ awk -F":" '{gsub(/,/,":"); a=$1FS$2FS$3; for(i=4; i<=NF; i++) print a FS $i;}' f1
17:79412041:C:T
17:79412041:C:CGGATGTCAT
17:79412059:C:G
17:79412059:C:T
17:79412138:G:A
17:79412138:G:C
17:79412192:C:G
17:79412192:C:T
17:79412192:C:A

我们首先将所有的,替换为:,以保持一个共同的分隔符即:
然后我们从第四个字段开始遍历,并通过在前三个字段加上前缀来打印每个字段。

0

另一个 awk,适用于任意数量的字段

$ awk -F: '{split($NF,a,","); for(i in a) {sub($NF"$",a[i]); print}}' file

0
以下是使用 `awk` + `gsub` 的示例,可能会对你有所帮助:
awk -F":" '{gsub(",",ORS $1 OFS $2 OFS $3 "&");gsub(/,/,":")} 1' OFS=":"   Input_file

0
这可能适用于你(GNU sed):
sed 's/^\(\(.*:\)[^:,]*\),/\1\n\2/;P;D' file

在每个逗号后插入一个换行符和键。

另一种方法是使用循环和语法糖:

sed -r ':a;s/^((.*:)[^:,]*),/\1\n\2/;ta' file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接