用FS(awk)分隔字符串的所有字符

时间:2013-12-19 00:38:38

标签: awk printf

我虽然这本来是一项简单的任务,但是没有!

输入(管道分隔):

record1|ABCDEFGH
record2|IJKLMNOP

我需要这个输出:

record1|A|B|C|D|E|F|G|H
record2|I|J|K|L|M|N|O|P

到目前为止我尝试了什么:

awk 'BEGIN{FS=OFS="|"}{a = split($2, b, ""); for(i=1; i<=a; i++){printf("%s|%s, $1, b[i](i==a? "\n":"|"))}}' input

我得到了:

record1|A
record1|B
record1|C
...

我不明白!如果有人能向我解释......

4 个答案:

答案 0 :(得分:6)

这是使用awk的另一种方式:

awk -F '|' '{ gsub(/./, FS "&", $2) }1' OFS= file

结果:

record1|A|B|C|D|E|F|G|H
record2|I|J|K|L|M|N|O|P

答案 1 :(得分:3)

你的printf遍布商店。通过如下所示的修改,它按预期工作

awk 'BEGIN{FS=OFS="|"}{a = split($2, b, "");
   printf "%s|", $1; 
   for(i=1; i<=a; i++){printf("%s%s", b[i],i==a? "\n":"|")}}' input

答案 2 :(得分:2)

在此代码中,您不需要OFSIFS是使用-F开关定义的。

awk -F "|" '{split($2,b,"");printf("%s",$1);for(i=1;i<=length($2);i++) printf("|%c",b[i]);printf("\n")}' input

或者,如果您不想使用额外的变量b并拆分以支持使用substr(),则可以将代码写为。

awk -F "|" '{printf("%s",$1);for(i=1;i<=length($2);i++) printf("|%c",substr($2,i,1));printf("\n")}' input

答案 3 :(得分:1)

按sed

sed ':a;s/|.\B/&|/;ta' file