linux - 从 .csv 文件读取值并使用 Shell 脚本执行计算

标签 linux bash shell csv scripting

请帮我解决这个问题。
如何使用 Shell 脚本执行以下操作(算术计算)。

sample1.csv

Assets,3,4,5
Loans,4,5,6
reported_activity,7,8,10

sample2.csv

credit,6,7,9
debit,13,5,8
affilate,9,4,5

sample1.csv中获取所有第一列值

3
4
7

& 从 sample2.csv 文件中获取第一列值

6
13
9

然后使用公式计算:

Assets + ( loans + affiliate *-1) + reported_activity + (credit-debit)
                         

     3 +( 4*-1)+7 (6-13)
                              =3-4+7-7
                              = -1
                      

同样,需要对两个.csv文件的col2和col3进行算术计算。

最佳答案

您可以转置 csv 文件并使用 awk 处理它们。您可以相应地修改打印语句中的公式。

paste -d" " <(rs -c',' -C -T < sample1) <(rs -c',' -C -T < sample2) | awk 'NR>1 {print $1+$2-$6+$3+$4-$5}'

不使用粘贴命令的替代方法

cat sample1 sample2 | rs -c, -C -T | awk 'NR>1 {print $1+$2-$6+$3+$4-$5}'

粘贴命令将连接这两个文件,您将获得包含所有列的最终文件。


由于 rs 仅在 BSD 系统中可用,因此下面的代码片段使用 awk 来转置输入。借用这个转置代码SO answer

BEGIN { FS=OFS="," }
{
    for (rowNr=1;rowNr<=NF;rowNr++) {
        cell[rowNr,NR] = $rowNr
    }
    maxRows = (NF > maxRows ? NF : maxRows)
    maxCols = NR
}
END {
    for (rowNr=1;rowNr<=maxRows;rowNr++) {
        for (colNr=1;colNr<=maxCols;colNr++) {
            printf "%s%s", cell[rowNr,colNr], (colNr < maxCols ? OFS : ORS)
        }
    }
}

将上述文件保存为transpose.awk并按如下方式运行

awk -f transpose.awk sample1.csv sample2.csv | awk -F, 'NR>1 {print $1+$2-$6+$3+$4-$5}'

关于linux - 从 .csv 文件读取值并使用 Shell 脚本执行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67983464/

相关文章:

regex - Bash:列出文件的不同前缀

shell - UNIX shell 脚本中的浮点运算

c - *几乎*完美的 C shell 管道

java - 在具有 maven 依赖项的 linux 命令中运行 java 文件

bash - 在 bash 中使用 awk/cut 剥离空间并获取值

linux - 在 Linux 上的何处放置/查找调试库?

linux - 在 scp 的简单函数包装器中使用代字号 ~ 的问题

linux - 如何遍历 bash 脚本中字符串类型的参数?

linux - 在单核上运行的进程的多个实例

linux - grep 在表达式中不使用 0