我有一个脚本,假设它是这样的(显然,我的真实脚本要复杂得多):
echo A
echo a
echo B
echo b
echo C
echo c
echo D
echo d
有没有简单的方法可以让这些线并排?
A a
B b
C c
D d
或者我最好先将其分成 2 个文件,然后再合并它们?我该怎么做?
答案1
用于此目的的便携式工具是paste
:
(
echo A
echo a
echo B
echo b
echo C
echo c
echo D
echo d
) | paste - -
来自规格:
的默认操作
paste
是将输入文件的相应行连接起来。除了最后一个输入文件的行之外,每一行的 <newline> 都将被替换为 <tab>。[…]
如果
-
为一个或多个文件指定了,则应使用标准输入;对于 的每个实例,应一次循环读取一行标准输入-
。
长度不等的行可能会产生不完全对齐的输出。要查看示例,请运行:
(
echo A line longer than others
echo a
echo B
echo b
) | paste - -
您可以通过管道修复此问题column
:
(
echo A line longer than others
echo a
echo B
echo b
) | paste - - | column -t -s $'\t'
笔记:
$'\t'
生成制表符在一些贝壳里,您可以使用 轻松实现这一点"$(printf '\t')"
。column
但其本身不可移植。column
在打印任何输出之前,它需要知道它的全部输入,因此它不是处理需要立即查看的内容的好工具;而且它是处理可能永远不会结束的数据(例如,来自潜在的无限循环)的错误工具。
答案2
您可以使用fmt
来格式化输出:
(
echo A
echo a
echo B
echo b
echo C
echo c
echo D
echo d
) | fmt -w 4
答案3
一种方法是避免在每行除最后一个字段之外的所有字段后打印换行符。(特别是当您的行包含不同数量的字段时。)
某些平台可以在echo
命令中执行此操作(例如,通过添加选项标志或字符串中的特殊序列),但我认为最简单的可移植方法是使用printf
命令。例如:
printf "A "
echo a
printf "B "
echo b
printf "C "
echo c
printf "D "
echo d
当然,您可以使用制表符或其他分隔符来代替 4 个空格。
在更复杂的情况下(例如,如果文本可能包含诸如 之类的字符%
),那么您将需要使用明确的格式字符串,例如printf "%s " "A"
。
如果需要,这还允许您对齐可变长度字段。例如:
printf "%-5s" A
echo a
printf "%-5s" BB
echo b
printf "%-5s" CCC
echo c
printf "%-5s" DDDD
echo d
给出输出:
A a
BB b
CCC c
DDDD d
(您可以通过删除-
;来使用右对齐,printf
还有许多其他格式选项。)
答案4
让我们在这里假设您的 echo 命令序列只是一个例证,它会产生几行文本,而这些文本在现实生活中来自于某个应用程序;因此,简单地echo -n
每隔一次说或用 替换echo
是printf
行不通的。
然后有一个简单的解决方案,它使用一个函数produce_output()
来替代你的输出生成程序:
$ produce_output() { echo A; echo a; echo B; echo b; echo C; echo c; echo D; echo d; }
$ produce_output | while read s1; do read s2; echo "$s1" "$s2"; done
A a
B b
C c
D d
当然,你可以使用printf
命令而不是echo
进行更多的输出格式控制。