Estou testando algumas coisas no bash e decidi comparar o número de linhas no arquivo com o número de linhas exclusivas. Eu sei que posso simplesmente criar 2 variáveis temporárias que armazenam os valores correspondentes e apenas compará-los, mas queria saber como fazer isso em uma linha.
Por exemplo, pensei que esta abordagem funcionaria: test `wc -l filename` -eq `uniq filename|wc -l`
. Eu recebo o erro -bash: test: too many arguments
. Onde está o meu erro e como você faria isso sem usar variáveis temporárias?
Responder1
Você não pode fazer uma comparação direta porque apenas wc -l file
resultados [number] file
e resultados . Você pode fazer como sugerido pelo @stelldriver, redirecionando o arquivo para a entrada padrão de , para que only seja gerado, ou usar awk para obter apenas o primeiro campo (veja abaixo).uniq file | wc -l
[number]
wc
wc -l < file
[number]
Além disso, os crases são ruins para a legibilidade. Prefira a $(command)
construção.
Você recebe "muitos argumentos" porque suas expressões não estão entre aspas, então o shell divide a [number] file
saída em duas palavras em vez de apenas uma.
Resumindo, é isso que você procura:
test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
Passamos wc -l file
a saída para o awk para obter apenas o primeiro campo, o [number]
.
Apenas para maior clareza na resposta, veja o que acontece com sua tentativa original acrescentando um echo
ao comando:
$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17
Como pode ser visto, existem 4 argumentos para o test
comando: 19
, file
, -eq
e 17
.
Se você tentar o que proponho, obterá uma comparação adequada com 3 argumentos para test
:
$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17