Se a coluna corresponder a outro arquivo, imprima todas as linhas com correspondência (awk / grep)

2

Estou usando dois arquivos de entrada, um com determinados números de ID e outro com uma grande lista de números de ID e colunas adicionais. O último arquivo contém várias linhas para cada número de ID e eu preciso extrair todas as linhas que correspondam a um ID do primeiro arquivo. Essas linhas devem ser impressas em um novo arquivo.

Editar 1: arquivos de amostra substituídos com trechos de reais

Editar 2: espaços extras removidos que estavam no trecho, mas não no arquivo real. É provável que os arquivos precisem ser higienizados de alguma forma, mas não está claro.

arquivo1:

AT1G56430
AT3G55190
AT3G22880

arquivo2:

AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

saída esperada

AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

[[

Eu tentei:

awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2 > output.txt

e:

grep -Ff file2 file1 > output.txt

Estou ciente de que há muitas perguntas semelhantes postadas nesses fóruns e outras. No entanto, eles não mencionam como a saída é tratada ... nem mencionam duplicatas. Eu já experimentei soluções de 4 deles, fiquei mexendo com isso por muitas horas e continuei tendo o mesmo problema: um arquivo de saída em branco.

Sou novo no awk e agradeço muito a ajuda. Desculpe se este é um problema simples com sintaxe etc; Por favor deixe-me saber. Obrigado pela ajuda.

    
por Michael Nagle 03.01.2017 / 07:16

3 respostas

1

Seu script do AWK está quase lá:

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1] > 0' file1 file2 > output.txt

funciona, depois de mudar os finais de linha do Mac para o Unix:

tr '\r' '\n' < file1 > file1.new
mv file1.new file1
tr '\r' '\n' < file2 > file2.new
mv file2.new file2

$1 é o primeiro campo no AWK.

Em vez de c[$1] > 0 , você pode escrever c[$1] . O > 0 não é necessário: qualquer valor diferente de zero funciona, portanto, também podemos usar o conteúdo de c diretamente:

awk -F'|' 'NR==FNR{c[$1]++;next};c[$1]' file1 file2 > output.txt
    
por 03.01.2017 / 07:25
0

experimente este comando awk.

bash-4.1$ cat file1
1
3

bash-4.1$ cat file2
1|A|B
1|C|D
2|E|F
3|G|H

bash-4.1$ awk -F\| 'NR==FNR{F1[$0];next}$1 in F1{print}' file1 file2
1|A|B
1|C|D
3|G|H
    
por 03.01.2017 / 08:03
0

Já experimentou join ?

$ tail -n +1 -- file1 file2
==> file1 <==
AT1G56430
AT3G55190
AT3G22880

==> file2 <==
AT1G01010|GO:0043090|RCA
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI

$ join -t'|' file1 file2
AT1G56430|GO:0010233|IGI 
AT1G56430|GO:0009555|IGI 
AT1G56430|GO:0030418|IGI
    
por 03.01.2017 / 08:31

Tags