Bash - 打印 CSV 文件

标签 bash csv

我正在尝试使用特定的列宽打印 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/

相关文章:

bash - 将多个参数从文本文件传递到 bash 脚本

c++ - 使用 sed 从 C++ 代码中删除异常规范

android - Bash:枚举所有连接的设备

powershell - 检查大型 csv 文件是否匹配 ID 需要很长时间

python - 将带有标题的列添加到制表符分隔的文本文件?

javascript - 如何使用 Node js 操作 DOM?

mysql - 选择存储在基于 VARCHAR 的 CSV 字段中的所有值的集合

ruby - 为什么堆栈内存限制系统之间的差异很大?

regex - 将一个变量中的字符串与另一个变量中的字符串精确匹配

python - 如何在Python中写入多个csv文件