awk não imprime $ 2 de um arquivo?

0

Estou executando este script de 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

Eu entendo isso para a primeira linha:

  + cat file.txt
  + echo A
  + awk {print $1}
  + AM=A
  + echo A
  + awk {print $2}
  + Bm=

como você pode ver, ele não pega o valor de 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
    
por bic ton 24.05.2017 / 18:12

3 respostas

0

Uma maneira é definir seu IFS como uma nova linha:

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

Embora existam outros métodos também:

while read Am Bm junk; do
   #my command Am +Bm....
done < file.txt
    
por 24.05.2017 / 18:27
1

for line in $(cat file.txt) irá iterar sobre cada glob no arquivo, um por um. A entrada enviada para awk sempre terá apenas uma coluna de entrada, portanto, $2 será sempre nulo.

    
por 24.05.2017 / 18:20
1

IFS divide por padrão o caractere de espaço para que o loop for faça um loop sobre cada "palavra"

$ for x in 'echo a 19 b whatever'; do echo $x; done
a
19
b
whatever
$ 

Uma abordagem melhor pode ser eliminar tanto o loop for quanto o uso inútil de cat por meio de algo como

$ cat input
A 19
B 81
C 76
D 31
$ awk '{system("echo "$2" "$1)}' input
19 A
81 B
76 C
31 D
$ 

onde echo seria o seu "meu comando" ...

    
por 24.05.2017 / 18:29

Tags