Selecione determinada coluna de cada arquivo, cole em um novo arquivo

7

Eu tenho 20 arquivos delimitados por tabulação com o mesmo número de linhas. Eu quero selecionar cada quarta coluna de cada arquivo, colado juntos para um novo arquivo. No final, o novo arquivo terá 20 colunas com cada coluna vindo de 20 arquivos diferentes.

Como posso fazer isso com o (s) comando (s) do Unix / Linux?

Entrada, 20 deste mesmo formato, eu quero a quarta coluna denotada aqui como A1 para o arquivo 1:

chr1    1734966 1735009 A1       0       0       0       0       0       1       0       
chr1    2074087 2083457 A1       0       1       0       0       0       0       0  
chr1    2788495 2788535 A1       0       0       0       0       0       0       0 
chr1    2821745 2822495 A1       0       0       0       0       0       1       0  
chr1    2821939 2822679 A1       1       0       0       0       0       0       0 
...

Arquivo de saída, com 20 colunas, cada coluna vem de uma das 4 colunas da coluna de 20 arquivos:

A1       A2       A3       ...       A20        
A1       A2       A3       ...       A20     
A1       A2       A3       ...       A20       
A1       A2       A3       ...       A20        
A1       A2       A3       ...       A20 
...
    
por Jun Cheng 30.09.2014 / 14:27

2 respostas

4

com paste sob bash você pode fazer:

paste <(cut -f 4 1.txt) <(cut -f 4 2.txt) .... <(cut -f 4 20.txt)

Com um script python e qualquer número de arquivos ( python scriptname.py column_nr file1 file2 ... filen ):

#! /usr/bin/env python

# invoke with column nr to extract as first parameter followed by
# filenames. The files should all have the same number of rows

import sys

col = int(sys.argv[1])
res = {}

for file_name in sys.argv[2:]:
    for line_nr, line in enumerate(open(file_name)):
        res.setdefault(line_nr, []).append(line.strip().split('\t')[col-1])

for line_nr in sorted(res):
    print '\t'.join(res[line_nr])
    
por 01.10.2014 / 16:19
2

O script a seguir faz isso usando o awk. Eu adicionei por conveniência um rownumber, que indica o número de linhas em seus arquivos (r). O número de colunas que você gostaria de colar é indicado por c.

directory=/your-directory/
r=4
c=20

for n in $(seq 1 $r); do
echo "$n" >> rownumber.txt
done

for n in $(seq 1 $c); do
awk '{ print $4}' /$directory/file-$n.txt > /$directory/output-$n.txt
done

paste /$directory/rownumber.txt /$directory/output-[1-$c]*.txt > /$directory/newfile.txt
    
por 30.09.2014 / 16:02