루프를 읽는 동안

루프를 읽는 동안

아래와 같은 파일이 있습니다

var     3   2014   string
var1    4   2011   string4
var2    6   1999   string2
var3    1   2016   string6

그런 다음 열 중 하나를 숫자와 비교한 다음 무언가를 에코하는 while read 루프가 있습니다. 그런데 제가 원하는 문구가 아니라 다른 문구가 나오더군요.

while read num
do
if [ "$num" = "0" ]; then
echo "Number is equal to zero"
else
echo "number is not equal to 0"
fi
done < home/dir/file.txt | awk '{print $2}' 

위의 내용을 에코하는 대신 파일의 두 번째 열을 에코합니다.

답변1

당신은 시도해야

awk '{print $2}' home/dir/file.txt | while read num
do
  if [ "$num" = "0" ]; then
    echo "Number is equal to zero"
  else
    echo "number is not equal to 0"
  fi
 done 

하이브리드 awk/bash 솔루션.

다른 사람들이 지적했듯이 awk 리디렉션은 나중에 발생합니다.

답변2

댓글을 달 수 없으니 왜 사람들이 IFS를 사용하지 않는지 궁금합니다.

while IFS=" " read var num year string
do
  if [[ $num -eq 0 ]]; then
    echo "Number is equal to zero"
  else
    echo "number is not equal to 0"
  fi
done < home/dir/file.txt

답변3

home/dir/file.txt | awk '{print $2}'의 출력을 리디렉션하려는 것 같습니다 while.

먼저 올바른 경로는 다음과 같아야 한다고 생각합니다 /home/dir/file.txt(그러나 이것은 단지 가설일 뿐입니다).

두 번째는 /home/dir/file.txt | awk '{print $2}'콘텐츠를 /home/dir/file.txt로 리디렉션하지 않지만 awk동안은 < /home/dir/file.txt awk '{print $2}'리디렉션합니다.

셋째, 명령 출력을 파일로 리디렉션하지만 이는 문자열이므로 다음으로 리디렉션해야 합니다 <<< "$(< /home/dir/file.txt awk '{print $2}')".

또는 명령 출력을 while루프 로 직접 파이프할 수 있습니다 < /home/dir/file.txt awk '{print $2}' | while read num.

while read num
do
    if [ "$num" = "0" ]; then
    echo "Number is equal to zero"
else
    echo "number is not equal to 0"
fi
done <<< "$(< /home/dir/file.txt awk '{print $2}')"

또는

< /home/dir/file.txt awk '{print $2}' | while read num
do
    if [ "$num" = "0" ]; then
    echo "Number is equal to zero"
else
    echo "number is not equal to 0"
fi
done

관련 정보