请帮我解决这个问题。
如何使用 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/