在下一行生成文件的输出

在下一行生成文件的输出

我有 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

相关内容