파이프로 줄을 읽는 방법

파이프로 줄을 읽는 방법

현재 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에 대해 0 값과 $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는 모든 대체를 실행할 수 있습니다

관련 정보