需要将固定宽度文件转换为';逗号';在unix中分隔

需要将固定宽度文件转换为';逗号';在unix中分隔,unix,Unix,需要将固定宽度文件转换为unix中以逗号分隔的文件 k12582927001611USNA k12582990001497INAS k12583053001161LNEU 所需输出: k,1258292700,1611,US,NA k,1258299000,1497,IN,AS k,1258305300,1161,LN,EU 使用awk和substr(): 输出: k,1258292700,1611,US,NA k,1258299000,1497,IN,AS k,1258305300,116

需要将固定宽度文件转换为unix中以逗号分隔的文件

k12582927001611USNA
k12582990001497INAS
k12583053001161LNEU
所需输出:

k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU

使用
awk
substr()

输出:

k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU
像这样:

awk -v FIELDWIDTHS="1 10 4 2 2" -v OFS=, '{print $1,$2,$3,$4,$5}' file
OFS
是输出字段分隔符,我将其设置为逗号。
FIELDWIDTHS
变量为您发挥了所有的魔力

或者您可以在
Perl
中这样做:

perl -ne 'm/(.)(.{10})(....)(..)(..)/; printf "%s,%s,%s,%s,%s\n",$1,$2,$3,$4,$5' file
sed -E 's/(.)(.{10})(....)(..)(..)/\1,\2,\3,\4,\5/' file
或者,在
sed
中,如下所示:

perl -ne 'm/(.)(.{10})(....)(..)(..)/; printf "%s,%s,%s,%s,%s\n",$1,$2,$3,$4,$5' file
sed -E 's/(.)(.{10})(....)(..)(..)/\1,\2,\3,\4,\5/' file

您可以通过管道将文件传输到:

awk '{print substr($0,1,1)","substr($0,2,10)","substr($0,12,4)","substr($0,16,2)","substr($0,18,2)}'
根据以下试运行:

pax> echo 'k12582927001611USNA
k12582990001497INAS
k12583053001161LNEU' | awk '
{
    print substr($0,1,1)","substr($0,2,10)","substr($0,12,4)","
        substr($0,16,2)","substr($0,18,2)
}'

k,1258292700,1611,US,NA
k,1258299000,1497,IN,AS
k,1258305300,1161,LN,EU

欢迎来到StackOverflow!这不是一个代码编写服务。我们希望你能表现出自己的努力。我们愿意帮助你,如果你被卡住了。@VMai问题很好。我遇到了同样的事情。这个问题和答案救了我+1同样,这是一个非常关键的问题,它给出了两个非常有用的答案。我认为代码没有读取固定宽度的空格。我也在试着阅读这篇文章。例如,如果固定宽度文件的ABC值为:k12582990001497IN,输出值应为k,12582990001497,IN,AS,ABC@user3894382你应该用你的实际输入和预期输出来更新你的文章。这个代码片段工作得很好。谢谢你及时的帮助。@konsolebox这是一种可怕的,可能是非法的行为。在发布到SOF之前,请始终清理数据中的样本数据。@DavidBetz这在发布的每个问题中都是非常常见的事情,应该已经暗示了这一点。如果你担心的话,告诉OP。没有必要一次又一次地提醒人们显而易见的事情。另外,我认为您应该注意到,但是发布的示例数据几乎没有任何意义。注意,FIELDWIDTHS仅适用于GNU awk(gawk),而不是Ubuntu通常附带的默认
awk