我虽然这本来是一项简单的任务,但是没有!
输入(管道分隔):
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
...
我不明白!如果有人能向我解释......
答案 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)
在此代码中,您不需要OFS
,IFS
是使用-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