아래와 같은 파일이 있습니다.
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}"
위를 에코하는 대신 파일의 두 번째 열을 에코합니다.
p>
코멘트
답변
시도해야합니다.
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 리디렉션은 나중에 발생합니다.
답변
home/dir/file.txt | awk "{print $2}"
의 출력을
루프;
먼저 올바른 경로는 /home/dir/file.txt
여야한다고 생각합니다 (그러나 이것은 단지 가정 일뿐입니다);
second /home/dir/file.txt | awk "{print $2}"
는 /home/dir/file.txt
의 콘텐츠를 awk
로 리디렉션하지 않습니다. , < /home/dir/file.txt awk "{print $2}"
는 수행합니다.
세 번째로, “명령의 출력을 파일로 리디렉션하지만”문자열 “로 리디렉션해야합니다. it : <<< "$(< /home/dir/file.txt awk "{print $2}")"
.
또는 명령의 출력을 while
루프로 직접 파이프 할 수도 있습니다. 대신 : .
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
답변
댓글을 달 수 없기 때문에 사람들이 왜 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
read num
를 수행하고 결과가 단일 숫자 (" 0 ) 그러나 실제로는 4 개의 열이있는 입력 파일을 읽고 있으므로$num
는 4 개의 열이있는 문자열이됩니다.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?done
루프. 즉 :is
x4