使用Shell进行CSV I / O操作?

时间:2019-01-29 06:58:16

标签: shell csv

我写了一个生成CSV文件的bash脚本。但是,我现在想运行一个循环,然后再生成此CSV文件并从每一列中扣除某些值。

这是我的代码,用于更好地理解:

for loop; do
    $VAL /*global*/
    file="./out_base.txt"
    while IFS=' ' read -r f1 f2 f3
    do
            $VAL = $f2
    done <"$file"

    file="./out_lw.txt"
    while IFS=' ' read -r f4 f5 f6
    do
            $((f4-VAL)) >> val_lw.csv
    done <"$file"
done

out_base.txt 的格式为:a b c

out_lw.txt 的格式为:d e f

所需的输出:val_lw.csv应该如下所示: b-e / *(其中-是数学减号)

例如: out_base.txt:

sim_ticks 32768#刻度数

sim_ticks 31111#刻度数

out_lw.txt:

sim_ticks 65433#刻度数

sim_ticks 74333#刻度数

目标val_lw.csv:

32665

43222

但是,我无法执行数学运算并无法获得理想的结果。

相应的输出:val_lw.csv是空白文件。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

我认为awk这样会使生活变得更轻松:

awk 'FNR==NR{x[FNR]=$2;next} {print x[FNR]-$2}' out_lw.csv out_base.csv > vl_lw.csv
32665
43222

说明:

awkout_lw.csv这两个文件上运行out_base.csv。如果要读取第一个文件,请将第二个字段保存在以行号x索引的数组FNR中,然后跳到下一行。如果读取第二个文件,请从x减去当前行的第二个字段,打印相应的保存值。


如果您真的想使用bash,它可能看起来像这样:

#!/bin/bash

# Load all numbers from "out_base.txt" into array "base[]"
base=( $(cut -d ' ' -f2 out_base.txt ) )

# Iterate through "out_lw.txt"
line=0
while read a b c ; do
   ((diff=b-base[line]))
   echo $diff
   ((line=line+1))
done < out_lw.txt