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
0
24.05.2017, 19:12
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
0
28.01.2020, 02:33

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 вместо вашей "моей команды"...

1
28.01.2020, 02:33

для строки в $(cat file.txt) будет перебирать каждый глобус в файле один за другим.Ввод, отправленный в awk, будет иметь только один столбец ввода, поэтому $2 всегда будет нулевым.

1
28.01.2020, 02:33

Теги

Похожие вопросы