我正在尝试使用某些列宽打印 CSV 文件。我认为 i 有一个错误导致第一列不打印。正如您将看到的,我是 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
我也无法将 case 语句转换为循环。无济于事,我尝试将整个 C 风格的 for 循环替换为:
for i in "${arg[@]}"; do
printf "%-${column_width[$i]}s" ${arg[$i]}
done
我确信有更好的方法来实现这一点。我正在尝试了解 sed/awk,但我现在想知道如何在没有它们的情况下做到这一点。