Problema com “while read” e cole

0

Eu tenho 69 arquivos chamados *.sites.pi . Por exemplo, OC9.sites.pi , cu27.sites.pi , etc.

O prefixo de cada arquivo (ou seja, antes do .sites.pi) está em um arquivo chamado ind_list .

$ cat ind_list
OC9
Ocu27
...

Eu quero mesclar as terceiras colunas de todos esses arquivos juntos.

Eu tentei:

while read i
do
    paste <(cut -f3 $i.sites.pi) >> output
done < ind_list

Mas isso não funciona. Como posso fazer isso funcionar?

    
por user236152 21.08.2015 / 15:05

3 respostas

4

Os arquivos de colagem precisam ter todos os elementos fornecidos ao mesmo tempo para paste . Desde que você está lendo um arquivo, você precisa primeiro armazenar o conteúdo em algum lugar - em um arquivo temporário, por exemplo - para que você possa então paste juntos.

Então, sugiro algo assim:

i=1
while read -r file
do
    awk '{print $3}' "$file" > file.$i
    ((i++))
done < ind_list

Agora você tem muitos arquivos file.XX com a terceira coluna do arquivo.

Depois, use algo como esse, onde Glenn Jackman nos ilumina :

paste -d " " file.{1..69} > output

E então você pode limpar todos os arquivos temporários dizendo rm file{1..69} .

    
por fedorqui 21.08.2015 / 15:20
1

Eu não tenho um terminal para testar minha resposta, então vou tentar um palpite cego.

Eu acho que pode haver uma diferença de comportamento entre

paste <(cut -f3 Ocu27.sites.pi) <(cut -f3 OS10.sites.pi) >output

e

paste <(cut -f3 Ocu27.sites.pi) >>output
paste <(cut -f3 OS10.sites.pi) >>output

Para resolver isso, você pode alterar seu loop original para:

while read i
do
    arguments="$arguments <(cut -f3 $i.sites.pi)"
done < ind_list
eval "paste $arguments >output"

Outro benefício disso é que você executa paste apenas uma vez no final de seu loop e pode, portanto, ter alguma melhoria de desempenho em comparação com o cálculo da colagem em cada iteração de seu loop

    
por Aserre 21.08.2015 / 15:23
0

Usando cat e awk

cat ind_list | xargs -i'{}' awk '{print $3}' "{}.sites.pi" > output

Exemplo

Arquivos de entrada

cat OC8.sites.pi

foo bar foobar

cat OC9.sites.pi

foo bar foobar

cat Ocu27.sites.pi

foobar foo bar

cat ind_list

OC8
OC9
Ocu27

O comando

cat ind_list | xargs -i'{}' awk '{print $3}' "{}.sites.pi" > output

O arquivo de saída

cat output

foobar
foobar
bar
    
por A.B. 21.08.2015 / 15:24