Я запускаю этот скрипт оболочки
#!/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)
будет итерировать по каждому отдельному глобу в файле, один за другим. Входные данные, отправленные в, 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