如何在linux中处理具有固定宽度列的文件

我想处理下面的文件:

01234000000000000000000+000000000000000000+ 02586000000000000000000+000000000000000000- 12345000000000000000000+000000000000000000- 12122000000000000000000+000000000000000000+ 

我想将上面的文件转换为:

 01234,000000000000000000+,000000000000000000+ 02586,000000000000000000+,000000000000000000- 12345,000000000000000000+,000000000000000000- 12122,000000000000000000+,000000000000000000+ 

input文件分别具有固定宽度的列5,19,19。

我想用linux命令解决。

我试过下面的命令,但它不工作:(

 awk 'BEGIN{FIELDWIDTHS="5 19 19";OFS=",";}{$1="$1,$2,$3"}' data.txt 

在ubuntu 14.04 LTS桌面操作系统上执行上面的命令,输出没有任何内容(空白)。

尽管您忘了{print} ,但您的尝试非常接近:

 awk 'BEGIN{FIELDWIDTHS="5 19 19";OFS=","}{$1=$1}1' file 

{$1=$1}将第一个字段分配给自己,这足以让awk“触摸”每条记录。 我用了速记1 ,这是最短的真实条件。 默认操作是{print}

请注意, FIELDWIDTHS是一个GNU awk扩展,所以如果你使用不同的版本,你将不得不采取不同的方法。 例如:

 awk 'BEGIN{OFS=","}{print substr($0,1,5),substr($0,6,19),substr($0,25)}' file 

这将是非常简单的:

 sed -n 's/\(.\{5\}\)\(.\{19\}\)\(.\{19\}\)/\1,\2,\3/p' your_file 

它所做的,就是在5,19,19之间捕捉每一行,然后用中间打印出来。

 $ echo 01234000000000000000000+000000000000000000+ | sed -n 's/\(.\{5\}\)\(.\{19\}\)\(.\{19\}\)/\1,\2,\3/p' 01234,000000000000000000+,000000000000000000+ 
 $ sed -r 's/(.{5})(.{19})/\1,\2,/' file 01234,000000000000000000+,000000000000000000+ 02586,000000000000000000+,000000000000000000- 12345,000000000000000000+,000000000000000000- 12122,000000000000000000+,000000000000000000+ 

Perl来拯救:

 perl -pe 'for $p (5, 25) { substr $_, $p, 0, "," }' data.txt 

这也是cut合适的任务

 $ cut --output-delimiter=',' -c1-5,6-24,25- data.txt 01234,000000000000000000+,000000000000000000+ 02586,000000000000000000+,000000000000000000- 12345,000000000000000000+,000000000000000000- 12122,000000000000000000+,000000000000000000+ 
  • --output-delimiter=','指定输出字段分隔符
  • -c选择指定的字符
  • 1-5第一场
  • 6-24秒场
  • 剩下的线路
 awk '{sub(/.0/,",0")sub(/+/,"+,")}1' file 0123,000000000000000000+,000000000000000000+ 0258,000000000000000000+,000000000000000000- 1234,000000000000000000+,000000000000000000- 1212,000000000000000000+,000000000000000000+