基于逗号将行拆分为多行:一个班轮解决方案
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于逗号将行拆分为多行:一个班轮解决方案相关的知识,希望对你有一定的参考价值。
我想将以下格式拆分为唯一的行
输入:
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是它使每个原始唯一的(在输入中用“,”分隔)。
在此先感谢Shams
答案
awk one-liner
$ 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
我们首先用,
替换所有:
以保持一个共同的分隔符,即:
然后我们从第4个字段遍历到结束,并通过在前三个字段前面打印每个字段。
另一答案
这个单线在这里:
$ 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':'
部分定义顶级分隔符。
另一答案
另一个awk
,应该适用于任何领域
$ awk -F: '{split($NF,a,","); for(i in a) {sub($NF"$",a[i]); print}}' file
另一答案
以下awk
+ gsub
也可以帮助你:
awk -F":" '{gsub(",",ORS $1 OFS $2 OFS $3 "&");gsub(/,/,":")} 1' OFS=":" Input_file
另一答案
这可能适合你(GNU sed):
sed 's/^\(\(.*:\)[^:,]*\),/\1\n\2/;P;D' file
在一行中插入换行符和每个逗号的键。
使用循环和句法糖的替代方案:
sed -r ':a;s/^((.*:)[^:,]*),/\1\n\2/;ta' file
以上是关于基于逗号将行拆分为多行:一个班轮解决方案的主要内容,如果未能解决你的问题,请参考以下文章