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 file
resultados [number] file
y 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]
wc
wc -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] file
salida 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 file
la 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 echo
al comando:
$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17
Como puede verse, hay 4 argumentos para el test
comando : 19
, y .file
-eq
17
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