awk가 파일에서 $2를 인쇄하지 않습니까?

awk가 파일에서 $2를 인쇄하지 않습니까?

이 쉘 스크립트를 실행 중입니다.

 #!/bin/sh
 for line in `cat file.txt`
 do
 Am=`echo $line| awk '{print $1}'`
 Bm=`echo $line| awk '{print $2}'`
 #my command Am +Bm.......
 done

나는 첫 번째 줄에서 이것을 얻습니다.

  + cat file.txt
  + echo A
  + awk {print $1}
  + AM=A
  + echo A
  + awk {print $2}
  + Bm=

보시다시피 Bm 값을 얻지 못합니다.

     $ cat file.txt
     A 19
     B 81
     C 76
     D 31

   $ awk '{print $2}' file.txt
    19
    81
    76
    31

  $ awk '{print $1}' file.txt
    A
    B
    C
    D

답변1

for line in $(cat file.txt)파일의 각 glob은 하나씩 반복됩니다. 전송된 입력에는 awk입력 열이 하나만 있으므로 $2항상 비어 있습니다.

답변2

IFS기본적으로 공백 문자로 분할되므로 for루프는 실제로 각 "단어"를 반복합니다.

$ for x in `echo a 19 b whatever`; do echo $x; done
a
19
b
whatever
$ 

더 나은 접근 방식은 다음과 같은 것을 통해 for루프와 쓸모없는 것을 제거하는 것입니다 .cat

$ cat input
A 19
B 81
C 76
D 31
$ awk '{system("echo "$2" "$1)}' input
19 A
81 B
76 C
31 D
$ 

echo대신에 너의 “나의 명령”은 어디에 있느냐…

답변3

한 가지 방법은 개행 문자로 설정하는 것입니다 IFS.

set -f; # suppress wildcard expansion since `cat...` is unquoted
IFS=$'\n'; for line in `cat file.txt`; do
   Am=`echo "$line" | awk '{print $1}'`
   Bm=`echo "$line" | awk '{print $2}'`
   #my command Am +Bm.......
done

하지만 다른 방법도 있습니다:

while read Am Bm junk; do
   #my command Am +Bm....
done < file.txt

관련 정보