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

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

以上是关于基于逗号将行拆分为多行:一个班轮解决方案的主要内容,如果未能解决你的问题,请参考以下文章

根据持续时间将行拆分为多行

将行拆分为多行 Oracle

将行拆分为多行 PL/SQL

使RegEx组将行拆分为列

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

将逗号分隔的单元格拆分为多行,保持原始行不变?