特定の列幅を使用して CSV ファイルを印刷しようとしています。最初の列が印刷されない原因となる i のエラーが 1 つずれていると思います。ご覧のとおり、私は bash を初めて使用し、必死に C のように動作させようとしています。
CSV='./test.csv'
column_width=(20 6 5 10 10 10 10 8 30)
IFS=","
while read LINE
do
set -- $LINE
arg=($@)
for (( i = 0 ; i < ${#arg[@]} ; i++))
do
case $i in
1) printf "%-20s" ${arg[$i]} ;;
2) printf "%-6s" ${arg[$i]} ;;
3) printf "%-5s" ${arg[$i]} ;;
4) printf "%-10s" ${arg[$i]} ;;
5) printf "%-10s" ${arg[$i]} ;;
6) printf "%-10s" ${arg[$i]} ;;
7) printf "%-10s" ${arg[$i]} ;;
8) printf "%-8s" ${arg[$i]} ;;
9) printf "%-30s\n" ${arg[$i]} ;;
esac
done
done < $CSV
unset IFS
ケースステートメントをループに変えるのにも問題があります。役に立たなかったので、C スタイルの for ループ全体を次のように置き換えてみました。
for i in "${arg[@]}"; do
printf "%-${column_width[$i]}s" ${arg[$i]}
done
これを達成するためのより良い方法があると確信しています。私はsed/awkについて学ぼうとしていますが、今のところそれらなしでそれを行う方法を知りたいです.