Comparando la salida de 2 comandos usando prueba sin variables temporales

Comparando la salida de 2 comandos usando prueba sin variables temporales

Estoy probando algunas cosas en bash y decidí comparar la cantidad de líneas en el archivo con la cantidad de líneas únicas. Sé que puedo simplemente crear 2 variables temporales que almacenen los valores correspondientes y simplemente compararlos, pero me preguntaba cómo hacerlo en 1 línea.

Por ejemplo, pensé que este enfoque funcionaría: test `wc -l filename` -eq `uniq filename|wc -l`. Recibo el error -bash: test: too many arguments. ¿Dónde está mi error y cómo lo harías sin utilizar variables temporales?

Respuesta1

No se puede hacer una comparación directa porque solo wc -l fileresultados [number] filey resultados . Puede hacer lo que sugirió @stelldriver, redirigiendo el archivo a la entrada estándar de , para que solo se genere, o usar awk para obtener solo el primer campo (ver más abajo).uniq file | wc -l[number]wcwc -l < file[number]

Además, las comillas invertidas son malas para la legibilidad. Prefiere la $(command)construcción.

Obtienes "demasiados argumentos" porque tus expresiones no están entrecomilladas, por lo que el shell divide la [number] filesalida en dos palabras en lugar de solo una.

Considerándolo todo, esto es lo que buscas:

test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"

Pasamos wc -l filela salida a awk para obtener solo el primer campo, el [number].


Solo para mayor claridad en la respuesta, vea lo que sucede con su intento original anteponiendo un echoal comando:

$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17

Como puede verse, hay 4 argumentos para el testcomando : 19, y .file-eq17

Si prueba el que propongo, obtendrá una comparación adecuada con 3 argumentos para test:

$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17

información relacionada