이 쉘 스크립트를 실행 중입니다.
#!/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
항상 null이 됩니다.
답변2
IFS
기본적으로 공백 문자를 분할하므로 for
루프가 실제로 각 "단어"를 반복합니다.
$ for x in `echo a 19 b whatever`; do echo $x; done
a
19
b
whatever
$
for
더 나은 접근 방식은 루프와 cat
다음과 같은 via 의 쓸모없는 사용을 모두 제거하는 것입니다 .
$ 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