以下是使用GNU awk和rev的一种方法
运行方式如下:
awk -f ./script.awk <(echo "hello" | cowsay){,} | rev
<代码>script.awk文件的内容如下:
FNR==NR {
if (length > max) {
max = length
}
next
}
{
while (length < max) {
$0=$0 OFS
}
}1
或者,这里是一行代码:
awk 'FNR==NR { if (length > max) max = length; next } { while (length < max) $0=$0 OFS }1' <(echo "hello" | cowsay){,} | rev
结果:
_______
> olleh <
-------
^__^ \
_______\)oo( \
\/\) \)__(
| w----||
|| ||
----------------------------------------------------------------------------------------------
这里还有一种只使用GNU awk
的方法:
执行方式如下:
awk -f ./script.awk <(echo "hello" | cowsay){,}
文件的内容如下:
BEGIN {
FS=""
}
FNR==NR {
if (length > max) {
max = length
}
next
}
{
while (length < max) {
$0=$0 OFS
}
for (i=NF; i>=1; i--) {
printf (i!=1) ? $i : $i ORS
}
}
或者,这里是一行代码:
awk 'BEGIN { FS="" } FNR==NR { if (length > max) max = length; next } { while (length < max) $0=$0 OFS; for (i=NF; i>=1; i--) printf (i!=1) ? $i : $i ORS }' <(echo "hello" | cowsay){,}
结果:
_______
> olleh <
-------
^__^ \
_______\)oo( \
\/\) \)__(
| w----||
|| ||
----------------------------------------------------------------------------------------------
解释:
这里是对第二个答案的解释。我假设您具有基本的 awk
知识。
FS=""
FNR==NR { ... }
while ...
for ...
还有一些你可能需要了解的事情:
{,}
通配符后缀是为了将输入文件名重复两次的简写。
不幸的是,它不是标准的Bourne shell。不过,你可以使用以下方式代替:
<(echo "hello" | cowsay) <(echo "hello" | cowsay)
此外,在第一个例子中,
{ ... }1
缩写为
{ ... print $0 }
。
希望有所帮助。
>
)在行被反转时没有被替换为<
,并且在其余图像被镜像时看起来很奇怪。 - Joachim Isaksson