使用 awk 对齐文本

使用 awk 对齐文本

我正在尝试格式化我的输出文件,以便行中的文本均匀分布,以左右对齐。进行左对齐和右对齐是微不足道的,但是如何使用 awk 进行左对齐和右对齐呢?

编辑

输入:

This is a text
that is
not distributed
evenly in a file

所需的输出应如下所示:

This  is  a text
that          is
not  distributed
evenly in a file

答案1

如果您提前知道目标宽度,则可以通过重新分配每行中的空格来获得基本的理由:

#!/usr/bin/awk -f

BEGIN {
    if (width == 0) width = 80
}

NF <= 1 { print }

NF > 1 {
    nbchar = 0
    for (i = 1; i <= NF; i++) {
        nbchar += length($i)
    }
    nbspc = width - nbchar
    spcpf = int(nbspc / (NF - 1))
    for (i = 1; i < NF; i++) {
        printf $i
        spaces = (NF == 2 || i == NF - 1) ? nbspc : spcpf
        if (spaces < 1) spaces = 1
        for (j = 0; j < spaces; j++) {
            printf " "
        }
        nbspc -= spaces
    }
    print $NF
}

(默认宽度为 80;用 覆盖-v width=...)。

其工作原理如下:

  • 没有字段或只有一个字段的行按原样输出;
  • 处理具有两个或多个字段的每一行:
    • 计算非字段分隔符字符的数量 ( nbchar);
    • 这决定了要分配的空间数量 ( ncspc);
    • 将其除以字段数减一,得到每个字段之间要打印的空格数(在 中向下舍入spcpf);
    • 除最后一个字段外,每个字段都会被打印;然后打印适当数量的空格 - 我们总是确保至少有一个,并且我们选择spcpf,除非只有两个字段的行,或者如果我们打印倒数第二个字段,在这种情况下,无论剩下多少空格(nbspc进行调整以跟踪);
    • 最后打印最后一个字段,并换行。

如果您想定位现有文本的宽度,请width使用如下所示的内容进行初始化:

awk 'length > max { max = length }; END { print max }'

(我不知道重置输入流的万无一失的方法awk- 您始终可以指定它是一个文件并相应地调整脚本。)

这会产生

This is a   text
that          is
not  distributed
evenly in a file

宽度为 16(现有文本的宽度),或者

This   is   a   text
that              is
not      distributed
evenly  in  a   file

宽度为 20,或

This is a text
that      is
not distributed
evenly in a file

宽度为 12(然后行溢出)。

答案2

干得好。

    cat file1.txt 
    This is a text
    that is
    not distributed
    evenly in a file

您说“行均匀分布”,因此注入“\t”制表符分隔,应该可以为您完成。

   cat file1.txt | awk '{print $1 "\t" $2 "\t" $3  "\t" $4 }'

 > file2.txt 

结果:

    cat file2.txt 
    This    is  a   text
    that    is      
    not distributed     
    evenly  in  a   file

相关内容