如何用管道读取行

如何用管道读取行

我目前正在尝试使用 BASH 读取 csv 文件。对于给定的机器类别和机器 ID [ ] 和 [ ](这些是用户定义的), csv 文件的第 10 个 [ $f10] 值必须大于 0。我正在编辑该文件,因为最新的信息是最后写入的。这是代码片段[忽略回声,因为我也将它们放在那里,看看我的代码是否进入了 while 和 if 循环]:m_classm_idtac

IFS=","
while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do

            echo "this is while loop"

            if [ "$f7" == "EnHr" ] && [ "$f10" -gt 0 ] && [ "$f4" == "$m_class" ] && [ "$f5" == "$m_id" ]
            then
                    hex_sensor_data=$f10
                    echo "IN IF LOOP: $hex_sensor_data"
                    break
            fi  
            echo "HEX DATA $hex_sensor_data"
done <<<"tac /DIRECTORY/TO/FILE.csv | sed 's/o,632/o,101/g' | sed 's/o,938/o,103/g' |  sed 's/o,510/o,112/g' | sed 's/ombo,713/ombo,102/g'"

这个 while 循环为任何 m_class m_id 呈现 0 值,也是$f10十六进制值 -break从循环中调用之后while read,我想对hex_sensor_data值进行一些处理。

问:我想要得到最后的csv 文件第 10 个空间中大于 0 的值,而 csv 文件的第 7 个值保存 EnHr,以及第 4 个和第 5 个保存值对于给定的 m_classm_id分别。为此,我需要从底部(最新信息)到顶部(最早的信息)读取 csv 文件,我正在这样做tac以及做一些管道。任何帮助表示赞赏!

答案1

<<<在 bash 中是这里的字符串。您将脚本字符串本身传递tac /DIRECTORY/TO/FILE.csv ...给了while标准输入。

您可能想使用流程替代:

while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do
    ...
done < <(tac /DIRECTORY/TO/FILE.csv ...)

答案2

#!/bin/bash

m_class='aaa'
m_id='bbb'

f4=0
f5=1
f7=2
f10=3

csvdata=( $(tac CSVFILE) )

hex_sensor_data=0
for linex in ${csvdata[@]}
do
    csvline=(
        $(echo "${linex}"|awk -F, '{if ($10 -gt 0) print $4,$5,$7,$10}')
    )
    [[ ${csvline[f4]} != "${m_class}" ]] && continue
    [[ ${csvline[f5]} != "${m_id}" ]] && continue
    [[ ${csvline[f7]} != "EnHr" ]] && continue
    hex_sensor_data=${csvline[f10]}
    break
done
[[ "${hex_sensor_data}" != "0" ]] && echo "${hex_sensor_data}"

答案3

你可以试试

tac /DIRECTORY/TO/FILE.csv |
sed -e 's/o,632/o,101/g' -e  's/o,938/o,103/g'  -e 's/o,510/o,112/g' -e 's/ombo,713/ombo,102/g' |
while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15
do

            if [ "$f7" = "EnHr" ] && [ "$f10" -gt 0 ] && [ "$f4" = "$m_class" ] && [ "$f5" = "$m_id" ]
            then
                    hex_sensor_data=$f10
                    echo "IN IF LOOP: $hex_sensor_data"
                    break
            fi
done
  • |如果最后一个字符是管道 ( ),则无需反斜杠换行
  • 单个 sed 可以运行所有替换

相关内容