Como percorrer um arquivo e extrair palavras usando seu índice?

2

O arquivo fornecido deve não ser armazenado na variável e, em seguida, atravessado devido a restrições de tamanho de memória:

Exemplo:

var=$(cat FILE)
for i in $var
do
  echo $i
done

Como você percorre todas as strings em um arquivo da mesma forma que o exemplo acima, mas extrai cada espaço em branco separado diretamente do arquivo?

Exemplo:

fileindex=1
totalfilecount=$(cat FILE | wc -w)
while (( ${fileindex} <= ${totalfilecount} ))
do
  onefilename= ??? missing command using fileindex
  ((fileindex+=1))
done

Existe um comando que pode exibir um arquivo como uma matriz e permitir que você extraia palavras usando suas posições de índice?

A ideia é processar cada palavra no arquivo como se o arquivo fosse uma matriz.

Exemplo de arquivo de entrada:

one two
three four
five six

Este é o cenário que requer a funcionalidade acima:

  • temos server_A e server_B
  • server_A precisa se conectar ao server_B via sftp (somente sftp) e 'pegar' alguns arquivos
  • Ambos os comandos 'ls' ou 'ls -l' no sftp podem estar usando curingas para filtrar arquivos específicos
  • cada arquivo precisa ser processado individualmente (por várias razões) em tempo real
  • os arquivos não podem ser copiados como um grupo para server_B e, em seguida, processados individualmente
  • uma lista de arquivos deve ser criada primeiro no server_A e, em seguida, cada arquivo dessa lista é copiado do server_B e processado um arquivo de cada vez

Onde está o problema?

O problema é como o comando 'ls' pode criar uma lista de palavras de duas colunas se a lista for longa, portanto não permitindo processamento simples como com 'ls -l', que sempre cria uma única lista de colunas.

Isso nos leva à minha pergunta inicial, se tal solução existe.

    
por Radnaskela Samot 16.11.2012 / 13:35

2 respostas

2

Você pode fazer isso por palavra usando awk , que deve atender aos seus requisitos de memória:

awk -v RS=\  '{
    # Do something with the word
    print
}' file

Você pode especificar qual string deseja usar NR .

$ awk -v RS=\  'NR==2{print}' <<< 'foo bar baz'
bar
    
por 16.11.2012 / 13:37
1

Quando você diz "strings" você quer dizer "palavras", certo? Cordas de caracteres separadas por espaço em branco. E de acordo com seus exemplos, você deseja acessá-los sequencialmente.

Você pode fazer:

$ sed 's/[ \t]\+/\n/g' YOUR_FILE | while read -r word ; do PROCESS $word ; done

Exemplo de uso:

% echo word1 word2 > YOUR_FILE
% echo word3 word4 >> YOUR_FILE
% echo word5 word6 >> YOUR_FILE
% sed 's/[ \t]\+/\n/g' YOUR_FILE | while read -r word ; do echo _${word}_ ; done
_word1_
_word2_
_word3_
_word4_
_word5_
_word6_
    
por 16.11.2012 / 14:21