while read loop (한국어)

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

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>

코멘트

  • 스크립트를있는 그대로 실행할 때 ' 실제로 문제를 재현 할 수는 없지만 어떤 경우에도 스크립트에 다른 문제가 있습니다. 주로 read num를 수행하고 결과가 단일 숫자 (" 0 ) 그러나 실제로는 4 개의 열이있는 입력 파일을 읽고 있으므로 $num는 4 개의 열이있는 문자열이됩니다.
  • 테스트되지 않았지만 파이프가 while 루프 후에 수행된다는 것이 문제라고 생각합니까? 어쨌든, 왜 모두 awk에있는 것은 아닙니다 : awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • 표시된 바와 같이,이 코드 조각은 … done 루프. 즉 : is x4

답변

시도해야합니다.

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 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다