将文本格式化为列

Ram*_*Ram 14 shell columns text-formatting

我有一个包含两列的文件,如下所示(示例):

文件 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9
Run Code Online (Sandbox Code Playgroud)

我需要格式化这个,我的预期输出应该是:

文件 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 20

如果输入只有两列,我会建议使用column -t. 但这在这里不太适用,因为该column实用程序会将任意数量的空格或制表符视为列分隔符:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      
Run Code Online (Sandbox Code Playgroud)

“Michael Rod”是两列,因此单行比其他行多一列,这会弄乱输出。

我们可以通过在最后一列之前插入一个制表符来解决这个问题,然后让column(仅)使用它作为分隔符:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Run Code Online (Sandbox Code Playgroud)

在awk中,NF是字段(列)数,$NF是最后一个字段的数据。在打印整行之前,我使用的脚本只是通过添加制表符来修改最后一个字段的数据。

如果您的 shell 不理解$'\t',那么您可以选择另一个不属于数据的字符:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Run Code Online (Sandbox Code Playgroud)