como manter parte de linhas dentro de um arquivo com base em informações em um segundo arquivo?

1

Eu tenho um arquivo de dados parecido com:

file1:

c1.212 3.4 90
c1.011 4.4 33
c2.09432 7.7 76
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c4.1211001 1.2 11
c4.1111222 1.2 10
c4.0000011 99 76
c5.123 11 01
c5.113 11 01
...

e o segundo arquivo se parece com:

c1.212
c3.2223
c3.0911
c5.113
...

como você vê no arquivo 1 com base nas informações da primeira coluna, existem 5 grupos (c1, c2, c3, c4 e c5) e cada gruop tem um número diferente de subconjuntos (por exemplo, c1 tem 2 subconjuntos, mas c2 tem um subconjunto), mas no segundo arquivo existem 3 grupos (c1, c3 e c5). O que eu quero é se algum grupo que é observado no arquivo2, permanecer no arquivo 1 com todos os seus subconjuntos e aqueles grupos que não são observados no arquivo 2 (c1 e c4), para serem removidos do arquivo1 com todos os seus subconjuntos. portanto, a saída deve se parecer com:

output:
    c1.212 3.4 90
    c1.011 4.4 33
    c3.0911 8.3 83
    c3.1121 4.3 23
    c3.2223 2.2 22
    c3.1211 2.2 12
    c5.123 11 01
    c5.113 11 01
    ...

Qualquer sugestão seria apreciada (o arquivo real tem mais de 45.000 linhas)

    
por zara 06.10.2016 / 02:34

2 respostas

1

Há o bom e velho ' awk staple

awk -F. 'NR==FNR {a[$1]++; next} $1 in a' file2 file1
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01

Ou, supondo que os identificadores de grupo ( c1 , c2 etc.) não apareçam em nenhum outro lugar no arquivo, você pode usar cut para extrair os identificadores e grep para combiná-los em seu primeiro arquivo, por exemplo

$ cut -d. -f1 file2 | grep -Fwf- file1
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01
    
por 06.10.2016 / 02:51
2

Use join plus uniq

join -t '.' -o 1.1,1.2 file1 file2 | uniq

Isso "dividirá" cada arquivo no "." caractere e linhas de saída que correspondem ao primeiro campo. A opção "-o" diz ao join para gerar apenas os dois primeiros campos do arquivo1

Você alterou a pergunta depois que eu a respondi, por isso não funciona agora :) Use sed para pré-processar os arquivos para substituir o primeiro "." com uma guia ou algum caractere exclusivo

    
por 06.10.2016 / 02:38