Você deseja extrair todas as linhas do primeiro arquivo cuja primeira coluna corresponda a uma coluna no segundo arquivo.
Como o primeiro arquivo parece conter apenas texto em sua primeira coluna (e o resto são números), poderíamos simplesmente usar grep
para isso.
Em bash
ou qualquer outro shell que entenda substituições de processos, isso seria uma questão de
grep -F -f <( awk -F, 'NR > 1 { print $1 }' <file2 ) file1 >newfile
Em outros shells, você deve primeiro gravar a saída do comando awk
em um arquivo temporário e usá-lo com grep -f
.
O awk
geraria saída como
p10_1003_length_529_cov_12.940299
p10_1021_length_525_cov_6.801508
p10_1047_length_521_cov_4.852792
p10_1152_length_501_cov_22.430481
p10_139_length_1152_cov_892.463415
p10_149_length_1130_cov_7.540379
e o grep
usaria esses padrões de sequência fixa para corresponder a cada linha no seu primeiro arquivo.
Você poderia fazer tudo em awk
também, o que incluiria a leitura na primeira coluna do segundo arquivo primeiro, como chaves em uma matriz associativa e, em seguida, testando a primeira coluna do primeiro arquivo com relação a essas chaves:
awk -F, 'NR==FNR && FNR>1 { keys[sprintf("\"%s\"", $1)] }
NR!=FNR && FNR>1 && ($1 in keys)' file2 file1
O estranho sprintf()
está lá porque a primeira coluna em file1
tem aspas duplas. Apenas adiciona aspas duplas aos dados lidos de file2
.
O FNR>1
ignora os cabeçalhos de ambos os arquivos, enquanto NR==FNR
é verdadeiro, se estivermos lendo file2
.