如何在bash中在结构良好的固定宽度文本文件的列之间添加空格



我有一个文本文件,其中的列以固定宽度隔开。文件的摘录应该是

| OOOO     OO   OOOOOOOOOOOOOOOOOOOOOOOOOO|
|    8      0   0                         |
|    9      1   8                         |
|   12     28   18                        |
|  108     16   250                       | 

我想在第二列和第三列之间添加空格,这样它们之间就会有10个空格,而不是3个空格。它看起来是这样的:

| OOOO     OO          OOOOOOOOOOOOOOOOOOOOOOOOOO|
|    8      0          0                         |
|    9      1          8                         |
|   12     28          18                        |
|  108     16          250                       | 

为了做到这一点,我尝试了:

awk '{print "  "$1"    "$2"          "$3 }' FILENAME

此命令确实添加了空格,但文本会错位。实际上,文本对第1列和第2列采用右侧对齐方式,对第3列采用左侧对齐方式。但是在我使用awk命令之后,文本变得混乱起来。

如何在不干扰文本对齐的情况下添加空格?

对于给定的格式,您可以执行:

awk '{printf("%4s%7s%10s%sn", $1, $2, " ", $3)}' FILENAME

(我假设垂直线不是文件的一部分,而是为了说明目的而添加的。(

$ awk '{printf "%-23s%sn",substr($0,1,16),substr($0,17)}' file
| OOOO     OO          OOOOOOOOOOOOOOOOOOOOOOOOOO|
|    8      0          0                         |
|    9      1          8                         |
|   12     28          18                        |
|  108     16          250                       |

sed中,您可以将每列捕获为一个固定宽度的字符串,包括前面的空格,而不是一个单词,这也有一个优点,即您的列数据可以包含空格,然后使用插入的空格重新发出。我相信你在awk也能做到。。。

sed 's/(.{5,5})(.{6,6})(.{4,100})/12      3/'

最新更新