我正在運行這個 shell 腳本
#!/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
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