将文本格式化为列


11

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

文件1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

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

文件1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9

1
2列在哪里?
Marc

两个输出似乎是相同的。您能否提供有关您问题的更多详细信息?

2
如何定义列?名称和数字之间是否有制表符或其他字符?我们怎么知道那Michael Rod 3是2列而不是3列?
terdon

2
不,不要张贴文字图片。我只是要复制并粘贴该文本以为您提供帮助,但现在我做不到。
Kusalananda

1
同上mmmint和terdon所说的;例如,您可以指定是否需要缩进的最后一列以允许最长的行的宽度吗?
杰夫·谢勒

Answers:


18

如果输入只有两列,我建议使用column -t。但是,由于column实用程序会将任意数量的空格或制表符视为列定界符,因此在这里并不能完全解决问题:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

“ Michael Rod”是两列,因此单行比另一行多一列,从而使输出混乱。

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

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

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

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

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.