漂亮打印空格分隔文件

时间:2018-04-13 16:34:11

标签: bash awk formatting

我有一个来自R的文件。它基本上是write.table命令的输出,用作分隔符" "。此文件的示例如下所示:

file1.txt
5285 II-3 II-2 2 NA NA NA NA 40 NA NA c.211A>G
8988 III-3 III-4 1 NA NA NA NA NA NA NA c.211A>G
8F412 III-3 III-4 2 NA NA 28 NA NA NA NA c.211A>G
4H644 III-3 III-4 2 NA NA NA NA NA NA NA NA

我需要获得的是一个非常特定格式的新文件,基本上我需要使用空格对齐所有列,我不能使用标签。

所需的输出将是

5285   II-3   II-2  2 NA NA NA NA 40 NA NA c.211A>G
8988   III-3  III-4 1 NA NA NA NA NA NA NA c.211A>G
8F412  III-3  III-4 2 NA NA 28 NA NA NA NA c.211A>G
4H644  III-3  III-4 2 NA NA NA NA NA NA NA NA

因此,在5285II-3之间,第一行,将有3个空格,在8F412III-3之间,第三行,只有两个空格。第一个树字段的长度可以不同,但​​其余列的长度始终是固定的(两个字符),但最后一个可以是12个字符

我可以在文本编辑器中执行此操作,但我有一个非常大的文件,我想使用bashawkR

来执行此操作

3 个答案:

答案 0 :(得分:4)

使用column

$ column -t file
5285   II-3   II-2   2  NA  NA  NA  NA  40  NA  NA  c.211A>G
8988   III-3  III-4  1  NA  NA  NA  NA  NA  NA  NA  c.211A>G
8F412  III-3  III-4  2  NA  NA  28  NA  NA  NA  NA  c.211A>G
4H644  III-3  III-4  2  NA  NA  NA  NA  NA  NA  NA  NA

答案 1 :(得分:2)

这是另一种方法

$ tr ' ' '\t' <file | expand -t2

5285  II-3  II-2  2 NA  NA  NA  NA  40  NA  NA  c.211A>G
8988  III-3 III-4 1 NA  NA  NA  NA  NA  NA  NA  c.211A>G
8F412 III-3 III-4 2 NA  NA  28  NA  NA  NA  NA  c.211A>G
4H644 III-3 III-4 2 NA  NA  NA  NA  NA  NA  NA  NA

答案 2 :(得分:1)

使用awk,以便您可以严格控制每个字段的格式设置:

awk '{ printf("%-5s %-5s %-5s %s %s %s %s %s %s %s %s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) }' file

产地:

5285  II-3  II-2  2 NA NA NA NA 40 NA NA c.211A>G
8988  III-3 III-4 1 NA NA NA NA NA NA NA c.211A>G
8F412 III-3 III-4 2 NA NA 28 NA NA NA NA c.211A>G
4H644 III-3 III-4 2 NA NA NA NA NA NA NA NA