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

用FS(awk)分隔字符串的所有字符,awk,printf,Awk,Printf,我原以为这是一项简单的任务,但没有 输入(管道分离): 我需要这个输出: 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 我不明白!如果有人能给我解释一下…你的printfs到处都是。经

我原以为这是一项简单的任务,但没有

输入(管道分离):

我需要这个输出:

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

我不明白!如果有人能给我解释一下…

你的
printf
s到处都是。经过如下所示的修改,它可以按预期工作

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
awk'BEGIN{FS=OFS=“|”}{a=split($2,b,”);
printf“%s |”,1美元;

对于(i=1;i,在此代码中,您将不需要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

awk-F“|”{split($2,b,”);printf(“%s”,$1);for(i=1;i这里有另一种使用
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
通过sed


我想你的意思是
FS
IFS
是一个bash主义。@史蒂夫-是的,你是对的。我的意思是FS,但写了IFS。我不需要更新我的回复,因为你已经提供了最好的解决方案。谢谢你!我不知道我们可以为每个字段拆分
printf
。这比我想象的要灵活得多。谢谢史蒂夫!这是一种方式更简单,真的没有考虑替换。+1我认为这是最好的解决方案。为了可读性,可能我们可以将OFS移到内部并使用print,而不是1.awk-F“|”'BEGIN{OFS=/}{gsub(/./,FS“&,$2);print}' input@user3088572:谢谢,但我不同意这样做可以提高可读性。如果您想使用
BEGIN
块,最好也在其中定义
FS
,而不是将其与
-F
标志一起使用。
OFS=/
最好写成
OFS=“”
。与使用
print
语句相比,简单地返回true要糟糕得多。
awk -F "|" '{printf("%s",$1);for(i=1;i<=length($2);i++) printf("|%c",substr($2,i,1));printf("\n")}' input
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
sed ':a;s/|.\B/&|/;ta' file