GNU awk
とを使用する 1 つの方法を次に示します。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){,}
の内容script.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
}
}
または、ここにワンライナーがあります:
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----||
|| ||
-------------------------------------------------- --------------------------------------------
説明:
これが2番目の答えの説明です。次の基本的な知識があることを前提としていawk
ます。
FS="" # set the file separator to read only a single character
# at a time.
FNR==NR { ... } # this returns true for only the first file in the argument
# list. Here, if the length of the line is greater than the
# variable 'max', then set 'max' to the length of the line.
# 'next' simply means consume the next line of input
while ... # So when we read the file for the second time, we loop
# through this file, adding OFS (output FS; which is simply
# a single space) to the end of each line until 'max' is
# reached. This pad's the file nicely.
for ... # then loop through the characters on each line in reverse.
# The printf statement is short for ... if the character is
# not at the first one, print it; else, print it and ORS.
# ORS is the output record separator and is a newline.
あなたが知る必要があるかもしれない他のいくつかのこと:
ワイルド{,}
カード サフィックスは、入力ファイル名を 2 回繰り返すための省略形です。残念ながら、これは標準の Bourne シェルではありません。ただし、代わりに次を使用できます。
<(echo "hello" | cowsay) <(echo "hello" | cowsay)
また、最初の例で{ ... }1
は、{ ... print $0 }
HTH。