需要将固定宽度文件转换为';逗号';在unix中分隔
需要将固定宽度文件转换为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
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
。