我有 3 个文件,例如abc.txt、def.txt 和 xyz.txt。我生成了一个 shell 脚本,我希望这 3 个文件的内容应按行显示,如下所示 -
abc ---- 1 2 3 4 5 6 7
def ---- 3 5 7 9 11 13 15
xyz ---- 4 8 12 16 20 24 28
文件的内容也应该像这样,并且每个值都是并行的。你能帮我生成 shell 脚本吗?但实际上,当我运行脚本时,它显示为 -
abc ---- 1 2 3 4 5 6 7
def ---- 3 5 7 9 11 13 15
xyz ---- 4 8 12 16 20 24 28
所以我想像上面那样安排输出内容。我在脚本中使用的位置满足上述要求-
for f in abc.txt def.txt xyz.txt; do (cat "${f}"; echo) >> output.txt; done
|awk '{printf "%-10s|%-10s|%-10s|%-10s|%-10s|%-10s|%-10s\n",$1,$2,$3,$4,$5,$6,$7} output.txt > final_output.txt
生成脚本是好方法吗
答案1
您可以使用列命令
./your_script | column -t -s' '
这将接近您想要的输出,但数字不会右对齐
abc ---- 1 2 3 4 5 6 7
def ---- 3 5 7 9 11 13 15
xyz ---- 4 8 12 16 20 24 28
要右对齐数字,只需将 shell 脚本的输出通过管道传输到 rev 和 columns 命令,如下所示
./your_script | rev | column -t -s' ' | rev
- 第一个
rev
将反转每一行 - 然后 columns 命令将创建以空格作为分隔符的列
- 最后,最后一个
rev
将恢复原始行 - 为您提供右对齐的数字。
答案2
我认为你应该使用@amisax'的答案来重写你的脚本以删除冗余。以下应该做你想做的事:
#!/bin/bash
for f in abc.txt def.txt xyz.txt
do
echo "$f --- " "$(cat $f)" >> ct_output.txt
done
column -t -s' ' ct_output.txt
这将创建一个临时文件,其中每一行都包含输入文件的名称,后跟其内容(假设内容只有一行),并column
按照 @amisax 的解释通过管道传输该文件。这应该会产生所需的
user@host $ ./columnize.sh
abc.txt --- 1 2 3 4 5 6 7
def.txt --- 3 5 7 9 11 13 15
xyz.txt --- 4 8 12 16 20 24 28