아래와 같은 파일이 있습니다
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