我正在尝试格式化我的输出文件,以便行中的文本均匀分布,以左右对齐。进行左对齐和右对齐是微不足道的,但是如何使用 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