Comando não encontrado erro awk

2

Estou recebendo este erro command not found neste código. Quero imprimir a primeira palavra de uma frase

Primeiro código (resultado necessário = 1)

abc="1 hello world"; L=$($abc|awk '{print }'); echo $L
1: command not found

Segundo Código (resultado necessário = mp4)

abc="mp4 hello world"; L=$($abc|awk '{print }'); echo $L
No command 'mp4' found, did you mean:
 Command 'mpp' from package 'makepp' (universe)
 Command 'mpy' from package 'yorick-mpy-mpich2' (universe)
 Command 'mpy' from package 'yorick-mpy-openmpi' (universe)
 Command 'mpc' from package 'mpc' (universe)
 Command 'm4' from package 'm4' (main)
 Command 'mp4h' from package 'mp4h' (universe)
 Command 'mpv' from package 'mpv' (universe)
 Command 'mpd' from package 'mpd' (universe)
 Command 'mp' from package 'mp' (universe)
 Command 'mpb' from package 'mpb' (universe)
    
por potholiday 11.06.2015 / 19:45

5 respostas

8

Você precisa de echo para passar a variável abc para STDOUT, para que awk possa usá-la como STDIN. Embora você pudesse escapar neste caso, mas sempre cite as variáveis (e substituição de comando), a menos que você tenha uma boa razão para não (por exemplo, você quer que a expansão do nome do caminho ocorra):

$ abc="1 hello world"; L="$(echo "$abc" | awk '{print }')"; echo "$L"
1

$ abc="mp4 hello world"; L="$(echo "$abc" | awk '{print }')"; echo "$L"
mp4

Você também pode usar as strings aqui:

$ abc="1 hello world"; L="$(awk '{print }' <<<"$abc")"; echo "$L"
1

$ abc="mp4 hello world"; L="$(awk '{print }' <<<"$abc")"; echo "$L"
mp4
    
por heemayl 11.06.2015 / 19:47
5

OBSERVAÇÃO: é uma boa prática colocar aspas em torno da variável com a qual você está trabalhando para que seja a única variável que você tem. Além disso, você não está introduzindo novas variáveis.

Existem algumas outras maneiras de alcançar o mesmo resultado.

Eu tenho alguns listados abaixo.

abc="1 hello world"; echo "$abc" | awk '{print }'

ou

abc="mp4 hello world" && echo "$abc" | awk '{print }'

ou se você quiser uma nova variável, de acordo com a substituição de comandos, ambos usando os backticks "'" e "$ (command)" ainda são formas válidas de alcançar os resultados desejados. Mais informações podem ser encontradas aqui .

com marcas de backtick:

abc="mp4 hello world"; L='echo "$abc" | awk '{print }''; echo "$L"

com "$ (comando)":

abc="1 hello world"; L="$(echo "$abc" | awk '{print }')"; echo "$L"

ambos produzirão uma nova variável "$ L" atribuída ao que você especificou.

    
por Terrance 11.06.2015 / 19:57
2

Tudo que você precisa é adicionar echo $abc em vez de $abc , assim:

abc="1 hello world"; L=$(echo $abc|awk '{print }'); echo $L

    
por Sergiy Kolodyazhnyy 11.06.2015 / 19:55
1

O problema com o código original, como foi mencionado, é que falta um eco. No entanto, embora outro pôster mencionou que você deve sempre citar variáveis, isso é incorreto. Muitas vezes, citar uma variável ajudará a resolver um possível nome de variável ambíguo, pois freqüentemente causa outros problemas ao interferir com outras citações. A maneira correta de especificar a variável, em tais casos, seria o uso de chaves ao redor do nome da variável, e não a citação em torno de toda a variável. Por exemplo, o código original poderia ser reescrito como: abc="1 hello world"; L=$(echo ${abc}|awk '{print }'); echo ${L}

Oh, @heemayl, você se esqueceu de citar o $ 1 em seu exemplo, o que é tão bom quanto colocar uma cotação em torno dessa variável não funciona.

    
por Scott McGee 12.06.2015 / 18:33
0

Em seu comando ... $($abc|awk '{print }'); ... , o conteúdo de $abc é executado como comando. Portanto, o erro.

Você pode testar isso em um terminal com:

$ 1 your text
1: command not found

Corrija sua versão:

abc="1 hello world"; L=$(echo "$abc"|awk '{print }'); echo $L

ou use uma versão mais curta:

awk '{print }' <<< $(echo "1 your text")

Exemplo

% awk '{print }' <<< $(echo "1 hello world")
1

% awk '{print }' <<< $(echo "mp4 hello world")        
mp4
    
por A.B. 11.06.2015 / 21:37