Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将固定宽度的文件从文本转换为csv_Linux_Csv_Awk_Export To Csv_Gawk - Fatal编程技术网

Linux 将固定宽度的文件从文本转换为csv

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

我有一个文本格式的大数据文件,我想通过指定每个列的长度将其转换为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, 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