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

标签 linux bash unix awk sed

我想处理以下文件:

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

关于linux - 如何在 Linux 中处理具有固定宽度列的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128106/

相关文章:

linux - 如何从差异中获得唯一差异

bash - catch a psql(PostgreSQL) command error in bash, that can be used generic, indifferent of the sql

bash - 需要 bash 函数中的循环建议

linux - curl 或读取每一行 url 文本文件,然后将每一行输出到标记为连续数字的单独文件 - 1 2 3 等

android - 如何从 linux 上用 android 手机调用电话?

linux - 虚拟 GPIO 仿真

linux - bash & inotify - 监控和移动文件

scripting - 使用 Awk 或 Cut 打印列?

linux - 如何修改我的用户配置文件以将我创建的脚本文件夹附加到我的 PATH 变量的末尾?

linux - 计算 shell 脚本每一步的时间并显示总执行时间