awk中的格式化打印

7

我有一个文件,我把它放到了维基中。

Marina Abramović 43199842
Vito Acconci 43160016
Bas Jan 80902233
Eija-Liisa Ahtila 43406552
Peggy Ahwesh 37006646
Rita Ackermann 43208993
Chantal Akerman 43272249
Vikky Alexander 80703016
Edward Allington 43387956
Francis Alÿs 43215850
Laurie Anderson 43170307
Carl Andre 43308046
Janine Antoni 43386750
Ida Applebroog 43392256
Nobuyoshi Araki 43387929
Diane Arbus 43394941
Siah Armajani 43312101
Arman smith  80008834
John Armleder 43437177
Richard Artschwager 43371334
Frank Auerbach 43386120

如果我在单词和名称之间加上管道符,当我将其放入维基时,它看起来像一个漂亮整齐的格式化表格。 我使用了awk,它运行得很好,但有时我花费更多的时间来使列更加平衡。

casper@casper-PC ~ ->
 11:16 PM Wed Dec 02$ awk '{$1="|" $1 ; $2=$2 "| " ; $3=$3 "|       |        |" ; print $0}' /tmp/joinNameNumber
|Marina Abramović|  43199842|       |        |
|Vito Acconci|  43160016|       |        |
|Bas Jan|  80902233|       |        |
|Eija-Liisa Ahtila|  43406552|       |        |
|Peggy Ahwesh|  37006646|       |        |
|Rita Ackermann|  43208993|       |        |
|Chantal Akerman|  43272249|       |        |
|Vikky Alexander|  80703016|       |        |
|Edward Allington|  43387956|       |        |
|Francis Alÿs|  43215850|       |        |
|Laurie Anderson|  43170307|       |        |
|Carl Andre|  43308046|       |        |
|Janine Antoni|  43386750|       |        |
|Ida Applebroog|  43392256|       |        |
|Nobuyoshi Araki|  43387929|       |        |
|Diane Arbus|  43394941|       |        |
|Siah Armajani|  43312101|       |        |
|Arman Smith|  80008834|       |        |
|John Armleder|  43437177|       |        |
|Richard Artschwager|  43371334|       |        |
|Frank Auerbach|  43386120|       |        |
casper@casper-PC ~ ->
 11:16 PM Wed Dec 02$

有没有一种方法可以以固定宽度打印出行?

|Marina Abramović   |  43199842|       |        |
|Vito Acconci       |  43160016|       |        |
|Bas Jan            |  80902233|       |        |
|Eija-Liisa Ahtila  |  43406552|       |        |
|Peggy Ahwesh       |  37006646|       |        |
|Rita Ackermann     |  43208993|       |        |
|Chantal Akerma     |  43272249|       |        |
|Vikky Alexander    |  80703016|       |        |
|Edward Allington   |  43387956|       |        |
|Francis Alÿs       |  43215850|       |        |
|Laurie Anderson    |  43170307|       |        |
|Carl Andre         |  43308046|       |        |
|Janine Antoni      |  43386750|       |        |
|Ida Applebroog     |  43392256|       |        |
|Nobuyoshi Araki    |  43387929|       |        |
|Diane Arbus        |  43394941|       |        |
|Siah Armajani      |  43312101|       |        |
|Arman Smith        |  80008834|       |        |
|John Armleder      |  43437177|       |        |
|Richard Artschwager|  43371334|       |        |
|Frank Auerbach     |  43386120|       |        |
casper@casper-PC ~ ->
 11:16 PM Wed Dec 02$

你想让控制台输出“看起来正确”吗?还是你想让它有“正确”的空格数来填充列?后者通常会很困难,因为awk无法访问wcwidth()。 - rici
寻找正确的位置 - 这样我就可以在维基百科中必要时编辑表格。 - capser
你的维基为什么不能使用HTML对齐呢?“向右对齐”可以使用控制台显示代码,例如“将光标移动到X列”,但我猜这对你不起作用。 - rici
1个回答

7

我想你说过你的输入文件是用管道分隔的(但我在你的样本数据中没有看到这个)。

如果你的数据确实是用管道分隔的,这里有一个解决方案。

awk -F"|" '{printf("|%-25s|%10s|%8s|%8s|\n", $1, $2, $3, $4)}' file > newFile

显然,%25s 的值表示宽度为25个字符,所以请根据需要进行更改。
偶尔在开头加上 -,例如 %-25s,表示左对齐文本。 修改后的数据解决方案
 awk '{printf("|%-25s|%10s|%8s|%8s|\n", $1 " " $2, $3, $4, $5)}' file > newFile

现在,$1 " " $2放在第1个和第2个"|"字符之间,依靠awk的连接特性为%-25s格式说明符提供1个值。 测试
echo "Peggy Ahwesh 37006646" | awk '{printf("|%-25s|%10s|%8s|%8s|\n", $1 $2, $3, $4, $5)}'

输出

|PeggyAhwesh              |  37006646|        |        |

源文件不是管道分隔符,但这是一个很好的答案!!!! - capser
你需要在名字的部分之间加上空格 $1 " " $2 吗? - Jonathan Leffler
@JonathanLeffler:啊,没错,谢谢,我会修复的。你太棒了!;-) - shellter
@casper:我完成了编辑工作,我想我该去睡觉了。祝大家好运。 - shellter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接