Read File palavra por palavra

0

Meu problema é ler um arquivo de texto palavra por palavra e recuperar cada palavra em uma variável. Eu tentei fazer:

while read ligne; 
do {
for ( i=1; i<= length ($ligne); i++); do
 { var=$(awk '{print $i}' test.txt)}

}done < test.txt

Mas isso não funciona e eu tenho esse erro:

Couldn't parse this for loop
    
por Aomine Daiki 09.04.2015 / 10:53

7 respostas

2

Depende de como você define palavras.

Se as palavras estiverem separadas por um ou mais espaços, você pode fazer:

tr -s '[:blank:]' '[\n*]' < file |
  while IFS= read -r word; do
    : echo "$word" here
  done

Se as palavras forem seqüências de caracteres, contenha A-Z , a-z e _ :

tr -cs 'A-Za-z_' '[\n*]' < file | ...

Em sistemas históricos do System V, você precisa usar colchetes [A-Za-z_] .

    
por 09.04.2015 / 11:20
1

Apenas

while read -ra line; 
do
    for word in "${line[@]}";
    do
        echo "$word";
    done;
done < test.txt

irá dividir o arquivo palavra por palavra. Mude o echo para o que você quiser fazer com as palavras.

ponto-e-vírgula é adicionado para que isso possa ser colocado em uma linha.

    
por 09.04.2015 / 11:20
1

Uma maneira mais simples, usando espaço em branco como separador e tudo mais como uma palavra,

set -o noglob
words=($(cat text_file)) # use split+glob operator with glob disabled
                         # above. Splits on space tab and newline with
                         # the default value of $IFS.

Se as palavras contiverem pontuações e pontuações, as palavras não causarão muitos problemas. Você pode tentar desta forma.

    
por 09.04.2015 / 19:50
0

Você receberá uma lista de "palavras" que foram separadas por espaços, mas com sinais de pontuação inclusos:

while read -a tmp_var; 
do
    for i in "${tmp_var[@]}"
    do
        var[${#var[*]}=$i
    done
done < test.txt

Mas, como de costume, test.txt foi transformado por tr ou sed ou etc. na lista "1 palavra na linha" por tr ou sed ou etc. e read line by linha.

    
por 09.04.2015 / 11:01
0

Considerando que você usou awk em sua pergunta, veja outra alternativa para tr e fmt :

awk '{ for ( i = 1; i < NF; ++i ) print $(i); }' test.txt |
while IFS= read -r var 
do 
    echo processing: "$var" 
done

Observe que, como ocorre com fmt e ao contrário de tr , awk aceita nomes de arquivos de entrada como argumentos.

    
por 09.04.2015 / 12:52
0

Eu escrevi o seguinte script de amostra que lê o arquivo /etc/passwd palavra por palavra.

#!/bin/bash

COUNT=1

FCOUNT='cat /etc/passwd|wc -l'

while [ $COUNT -le $FCOUNT ]
do
    FTCOUNT='awk -F ":" '{print NF,$0}' /etc/passwd|awk '{print $1}'|head -$COUNT|tail -1'
    TCOUNT=1
    while [ $TCOUNT -le $FTCOUNT ]
    do
            if [ $TCOUNT -gt $FTCOUNT ]
            then
                    FTCOUNT=""
                    break
            else
                    OUTPUT='head -$COUNT /etc/passwd|cut -d ":" -f $TCOUNT|tail -1'
                    echo -n "${OUTPUT} "
                    sleep 2
                    TCOUNT=$(( TCOUNT + 1 ))
            fi
    done
    echo ""
    COUNT=$(( COUNT + 1 ))
done
    
por 07.03.2016 / 18:09
0
read -a WORDS -d "" < file.txt
for word in "${WORDS[@]}"
do
        echo $word
done

Opção -a armazena as palavras em uma matriz.

A opção -d especifica a cadeia delim. Isso informa a leitura de onde parar o processamento do arquivo. Eu especifiquei uma string vazia que faz com que a leitura continue até obter um EOF. Ou seja, o arquivo inteiro é processado independentemente dos finais de linha.

    
por 06.04.2017 / 06:45