我正在尝试使用特定的列宽打印 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,但我想知道现在如果没有它们该怎么做。
最佳答案
#!/usr/bin/env bash
csv=./test.csv
column_width=(20 6 5 10 10 10 10 8 30)
while n=0; IFS=, read -ra x; do
printf '%-*s' {,,,,,,,,}{"${column_width[n]}","${x[n++]}"} 1 $'\n'
done <"$csv"
关于Bash - 打印 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320560/