パイプで行を読む方法

パイプで行を読む方法

私は現在BASHを使ってcsvファイルを読み取ろうとしています。 csvファイルの10番目の[]値は、指定されたシステムクラスとシステムID []と[](カスタム)に対して$f100より大きくなければなりません。最新情報が最後に記録されたため、ファイルを編集しています。以下はコードスニペットです。 [私のコードが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のゼロ値と$f1016進値をレンダリングします。breakループから呼び出した後、その値に対していくつかの処理を実行したいとwhile read思います。hex_sensor_data

尋ねる:欲しい最後csvファイルの10番目のスペースに0より大きい値があり、csvファイルの7番目の値はEnHr、4番目と5番目の値は値を含みます。与えられたものについて m_classそしてm_idそれぞれ。これを行うには、csvファイルを下部(最新情報)から上部(最も古い情報)に読み込む必要があり、tacパイプ操作とともにこれも実行しています。助けてくれてありがとう!

答え1

<<<バッシュではそうですここにある文字列。スクリプト文字列自体を標準入力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はすべての置換を実行できます

関連情報