Linux 将固定宽度的文件从文本转换为csv
我有一个文本格式的大数据文件,我想通过指定每个列的长度将其转换为csv 列数=5 列长度Linux 将固定宽度的文件从文本转换为csv,linux,csv,awk,export-to-csv,gawk,Linux,Csv,Awk,Export To Csv,Gawk,我有一个文本格式的大数据文件,我想通过指定每个列的长度将其转换为csv 列数=5 列长度 [4 2 5 1 1] 样本观察: aasdfh9013512 ajshdj 2445df 预期产量 aasd,fh,90135,1,2 ajsh,dj, 2445,d,f 我将使用sed捕捉具有给定长度的组: $ sed -r 's/^(.{4})(.{2})(.{5})(.{1})(.{1})$/\1,\2,\3,\4,\5/' file aasd,fh,90135,1,2 ajsh,dj, 24
[4 2 5 1 1]
样本观察:
aasdfh9013512
ajshdj 2445df
预期产量
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
我将使用
sed
捕捉具有给定长度的组:
$ sed -r 's/^(.{4})(.{2})(.{5})(.{1})(.{1})$/\1,\2,\3,\4,\5/' file
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
GNU awk(gawk)通过字段宽度直接支持这一点,例如:
gawk '$1=$1' FIELDWIDTHS='4 2 5 1 1' OFS=, infile
输出:
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
如果有人还在寻找解决方案,我已经用python开发了一个小脚本。只要您有Python3.5,它就很容易使用
这里有一个与常规的awk
(不需要gawk
)一起使用的解决方案
它使用awk的substr
函数定义每个字段的起始位置和长度OFS
定义输出字段分隔符(在本例中为逗号)
(旁注:这仅在源数据没有任何逗号时有效。如果数据有逗号,则必须将其转义为正确的CSV,这超出了本问题的范围。)
演示:
输出:
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
美好的我不知道这个功能。大+1!相关链接:“FIELDWIDTHS”参数仅在我安装并使用gawk
时适用;在Ubuntu 14.04.3上。@Arthur:根据,FIELDWIDTHS自gawk 2.13,即2010年7月开始提供。@Thor是的,我确信这是正确的。但是,如果未安装gawk
,则无所谓。至少对我来说,在Ubuntu 14.04.3上安装了awk
,但没有安装gawk
@Arthur:是的,这是一个GNU-awk(gawk)特定的答案,我会更清楚地说明这一点。出于某种原因,许多Debian派生的系统都将mawk作为默认的awk替代方案,可能是因为它更快。首先,感谢您回答这个问题。但在实际文件中,我必须将其拆分为80列,sed命令只能处理9列。请帮忙。@AshishKumar那么你可能必须用Thor的答案来回答awk
。
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f