基于逗号将行拆分为多行:一个班轮解决方案

时间:2018-03-02 00:58:02

标签: awk sed

我想将以下格式拆分为唯一行

输入:

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是它使每个原始唯一的(在输入中由","分开)。

提前致谢 沙姆斯

5 个答案:

答案 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