我想将以下格式拆分为唯一行
输入:
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是它使每个原始唯一的(在输入中由","分开)。
提前致谢 沙姆斯
答案 0 :(得分: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
我们首先将所有,
替换为:
以保留一个共同的分隔符,即:
然后我们从第4个字段遍历到结束并通过在前三个字段前面打印每个字段。
答案 1 :(得分:0)
这个单行:
$ 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':'
部分定义顶级分隔符。
答案 2 :(得分:0)
另一个find_all()
,适用于任意数量的字段
awk
答案 3 :(得分:0)
关注awk
+ gsub
也可以帮助您:
awk -F":" '{gsub(",",ORS $1 OFS $2 OFS $3 "&");gsub(/,/,":")} 1' OFS=":" Input_file
答案 4 :(得分:0)
这可能适合你(GNU sed):
sed 's/^\(\(.*:\)[^:,]*\),/\1\n\2/;P;D' file
在一行中插入换行符和每个逗号的键。
使用循环和句法糖的替代方法:
sed -r ':a;s/^((.*:)[^:,]*),/\1\n\2/;ta' file