次の3つのファイルがあります。abc.txt、def.txt、xyz.txt。シェルスクリプトを作成したので、この3つのファイルの内容を以下のように1行ずつ表示したいと思います。
abc ---- 1 2 3 4 5 6 7
def ---- 3 5 7 9 11 13 15
xyz ---- 4 8 12 16 20 24 28
ファイルの内容も次のようにする必要があり、各値は並列に表示する必要があります。シェルスクリプトを作成するのに役立ちますか?しかし、実際にスクリプトを実行すると、次のように表示されます。
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
数値を右揃えにするには、次のようにシェルスクリプトの出力を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
これにより、各行に入力ファイルの名前とその内容を含む一時ファイルが作成されます(仮定)。内容はちょうど1行です)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