我目前正在尝试使用 BASH 读取 csv 文件。对于给定的机器类别和机器 ID [ ] 和 [ ](这些是用户定义的), csv 文件的第 10 个 [ $f10
] 值必须大于 0。我正在编辑该文件,因为最新的信息是最后写入的。这是代码片段[忽略回声,因为我也将它们放在那里,看看我的代码是否进入了 while 和 if 循环]:m_class
m_id
tac
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_class
和m_id
分别。为此,我需要从底部(最新信息)到顶部(最早的信息)读取 csv 文件,我正在这样做tac
以及做一些管道。任何帮助表示赞赏!
答案1
答案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 可以运行所有替换