Como sobre um loop simples
while IFS= read -r line ;
do
printf "%s" "$line" | wc -c
done < some-file.txt
Eu quero chamar um comando para cada linha da entrada padrão, muito parecido com xargs
, mas a linha deve ser passada como entrada padrão, não como um argumento de linha de comando:
cat some-file.txt | <magic> | wc -c
Quais são minhas opções?
(O caso de uso real está processando uma combinação tail -f
/ grep
com jq
que parece ser apenas iniciar o processamento quando atingir o EOF.)
Como sobre um loop simples
while IFS= read -r line ;
do
printf "%s" "$line" | wc -c
done < some-file.txt
Um loop de leitura de tempo é o mais claro. Se você quiser usar xargs para fazer algo para cada linha, você pode acabar com uma monstruosidade como esta:
printf "%s\n" "foo bar" one " 1 2 3" |
xargs -d '\n' -n 1 -I LINE bash -c 'wc -c <<< "LINE"'
8
4
7
Muito caro, já que você precisa gerar um processo bash para cada linha.
cat file.txt | while IFS= read -r i; do echo -n "$i" | wc -c; done
## or (better):
while IFS= read -r i; do echo -n "$i" | wc -c; done < file.txt
No entanto, isso irá apenas imprimir o número de caracteres em uma linha, uma linha por vez. Se você quiser algo mais legível, talvez queira uma das seguintes opções:
## Prints the contents of each line underneath the character count:
while IFS= read -r i; do echo -n "$i" | wc -c; echo "$i"; done < file.txt
## Prints the line number alongside the character count:
n=0; while IFS= read -r i; do n=$((n+1)); echo -n "line number $n : "; echo -n "$i" | wc -c; done < file.txt
Para maior portabilidade, você pode usar printf '%s' "$i"
em vez de todos os echo -n
s
Tags bash pipe io-redirection