繁体   English   中英

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

[英]How to process file having fixed width columns in linux

我想处理下面的文件:

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

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

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

输入文件分别具有固定宽度列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 -r 's/(.{5})(.{19})/\1,\2,/' file
01234,000000000000000000+,000000000000000000+
02586,000000000000000000+,000000000000000000-
12345,000000000000000000+,000000000000000000-
12122,000000000000000000+,000000000000000000+

这很容易:

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+

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秒场
  • 25-其余的线
awk '{sub(/.0/,",0")sub(/+/,"+,")}1' file

0123,000000000000000000+,000000000000000000+
0258,000000000000000000+,000000000000000000-
1234,000000000000000000+,000000000000000000-
1212,000000000000000000+,000000000000000000+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM