Estou tentando criar um comando complexo (usando substituições de shell e expressões aritméticas) e queria saber se alguém poderia me ajudar a entender a saída do wc
comando.
Por exemplo, aqui estão alguns exemplos:
[11:10:33] labreu:~ $ wc -l test.txt
5 test.txt
[11:10:40] labreu:~ $ cat test.txt| wc -l
5
Por que o comando retorna valores diferentes? Eu tentei olhar para sua página de manual, mas não há nada sobre isso ...
Aliás, só estou perguntando sobre isso porque estava tentando pular x linhas de um arquivo com o seguinte comando:
[11:25:35] labreu:~ $ tail -n "+$(( $(wc -l test.txt)-2 ))" test.txt
zsh: bad math expression: operator expected at `test.txt-2...'
Depois de perceber que wc
retorna number_of_lines filename
e que usando pipes (ou redirecionamento produz um resultado diferente), consegui obter o que precisava usando algo assim:
tail -n "+$(( $(wc -l<test.txt )-2 ))" test.txt
tail -n "+$(( $(cat test.txt | wc -l )-2 ))" test.txt
De qualquer forma, a questão principal permanece: por que o wc
comando retorna uma saída diferente quando usado dentro de um pipe (ou com redirecionamento de entrada)?
Obrigado
O primeiro método que você usa na linha de comando. O segundo método pode ser usado na codificação.
O próprio comando pode fazer isso para mais de 1 arquivo, portanto, ele precisa informar qual quantidade de linhas pertence a qual arquivo.
wc -l
em si não distingue entre 1 arquivo, um curinga ou vários arquivos. Para fazê-lo sem o nome, costumo usá-wc -l < file.txt
lo com um redirecionamento.O método concatenar/versão canalizada é sempre 1 arquivo, então o nome do arquivo está implícito. Um loop for ainda implicaria 1 arquivo por,
wc -l
mas repetindo o mesmo várias vezes.