使用分隔符拆分字符串并保留第一列

时间:2016-12-19 14:46:38

标签: bash sed split

我有以下结构:

column1,column2
value1,string1;string2;string3;string4
value2,string11;string22

我想修改该结构并使用以下格式创建一个新文件:

column1,column2
value1,string1
value1,string2
value1,string3
value1,string4
value2,string11
value2,string22

2 个答案:

答案 0 :(得分:1)

这个awk单行应该有所帮助:

awk -F"[;,]" 'NR==1{print;next}{for(i=2;i<=NF;i++)print $1","$i}' file

答案 1 :(得分:0)

这是一个sed解决方案,如果只是为了显示它在awk中的容易程度(并且因为编写sed命令很有趣):

$ sed '1b;:a;s/^\([^,]*\),\([^;]*\);/\1,\2\n\1,/;ta' infile
column1,column2
value1,string1
value1,string2
value1,string3
value1,string4
value2,string11
value2,string22

这是基于观察到每行(在第一行之后),;必须由换行符,第一个单词和逗号替换。

可阅读评论:

1b                                   # On first line: jump to end and print
:loop                                # Label to jump to
s/^\([^,]*\),\([^;]*\);/\1,\2\n\1,/  # Substitute one ";" as described above
t loop                               # If the pattern was modified, jump to "loop"

替换命令中的捕获组是&#34;从行开头的,以外的字符&#34; (第一组)和&#34; ;之间的字符,与第一个;&#34;之间的字符,因此在循环第一行以进行更改时,第一次捕获小组始终为value1,第二个小组在每次迭代中为string1string2,依此类推。

例如,在MacOS中发现的BSD sed抱怨在单行中分支标签。在这种情况下,命令必须像这样分解:

sed -e '1b;:a' -e's/^\([^,]*\),\([^;]*\);/\1,\2\n\1,/;ta' infile