Existe uma maneira de obter o inteiro que wc retorna em bash?
Basicamente, quero escrever os números das linhas e as contagens de palavras na tela após o nome do arquivo.
output: filename linecount wordcount
Aqui está o que tenho até agora:
files=`ls`
for f in $files;
do
if [ ! -d $f ] #only print out information about files !directories
then
# some way of getting the wc integers into shell variables and then printing them
echo "$f $lines $ words"
fi
done
cut
trabalhar na saída completa dewc $f
porque o número de espaços entre os campos varia.A resposta mais simples de todas:
fonte
wc -c < file name
isso, ele fornecerá apenas o número inteiro de bytes e nada mais.Somente:
fará o trabalho. Mas esta saída inclui espaços em branco prefixados à medida que
wc
alinha o número à direita.fonte
wc -l < foo.txt | xargs
ref - stackoverflow.com/a/12973694/149428lines=`wc -l < $f`
resulta em uma "linha" variável cujo valor não tem espaços à esquerda.find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l
funciona bem, mas imprime todos os arquivos. Se eu usarfind . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <
, recebo um erro.parse error near '\n'
Ajuste conforme necessário para o seu layout.
Também é melhor usar lógica positiva ("é um arquivo") em vez de negativa ("não é um diretório")
fonte
wc $file | awk '{print $4" "$2" "$1}'
- apóstrofos fora de{}
.Às vezes, wc produz em formatos diferentes em plataformas diferentes. Por exemplo:
No OS X:
Em Centos:
Portanto, usar apenas cortar pode não recuperar o número. Em vez disso, tente tr para excluir caracteres de espaço:
fonte
As respostas aceitas / populares não funcionam no OSX.
Qualquer um dos itens a seguir deve ser portável em bsd e linux.
OU
OU
fonte
Se você redirecionar o nome do arquivo para
wc
ele, ele omite o nome do arquivo na saída.Bash:
ou
Em vez de usar
for
para iterar sobre a saída dels
, faça o seguinte:que funcionará se houver nomes de arquivos que incluam espaços.
Se você não pode usar globbing, você deve canalizar em um
while read
loop:ou usar substituição de processo
fonte
read lines words characters filename <<< $(wc "$f")
Ah, e se você costumava * ser protegido contra espaços, também deve colocar aspas duplas na var ao usá-la.$f
neste caso), é desnecessário. Além disso, o OP perguntou como obter apenas o número inteiro. Você está correto sobre citar uma variável, mas não mostrei o uso da variável, então omiti a menção desse ponto. Ofor f in *
formulário quase sempre deve ser usado em vez de usar a saída dels
, como você sabe.ls
ponto. Isso vai te render um prêmio. partmaps.org/era/unix/award.html#lsread lines words characters _ <<< $(wc "$f")
$_
é apenas uma variável diferente.Se o arquivo for pequeno, você pode chamar
wc
duas vezes e usar algo como o seguinte, o que evita canos para um processo extra:A
$((...))
é a expansão aritmética do bash. Ele remove qualquer espaço em branco da saída dewc
neste caso.Esta solução faz mais sentido se você precisa tanto o LineCount ou o wordcount.
fonte
Que tal com
sed
?fonte
fonte
Tente isto para o resultado numérico:
nlines = $ (wc -l <$ myfile)
fonte
Experimente isto:
Ele cria uma contagem de linha e uma contagem de palavras (LINE e WC) e aumenta-os com os valores extraídos de wc (usando $ 1 para o valor da primeira coluna e $ 2 para a segunda) e finalmente imprime os resultados.
fonte
Saídas: linhas myfile.txt: 10 palavras: 20 bytes: 120
fonte
fonte
perl
qualquer maneira, pode muito bem fazer a contagem de palavras em Perl também. Uma abordagem mais econômica seria canalizar paratr -d '[:space:]'