我正在运行这个 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