Mesclando vários arquivos por linha

2

É possível copiar as linhas de File1 e File2 em um novo File4 seguindo a instrução dada por File3 usando um script bash simples (sed? awk?).

 File1: /*two or more columns, tab delimited*/
    AC    456324
    DC    689712
    GH    123677
    KL    236587

File2: /*two or more columns, tab delimited*/
    DC    AABBC TTYJU
    AC    DDDEE YYUKI
    KL    GGHHG QQSSD

 File3: /*one column*/
    AC
    DC

File4 /*tab delimited*/
    AC    456324    DDDEE   YYUKI
    DC    689712    AABBC   TTYJU

Na verdade, estou realizando isso usando dicionários Python e imaginei se você conhecia uma saída simples.

Nota: esta questão, na sua forma mais simples, já tem uma resposta em: Mesclando arquivo por linha

    
por dovah 10.07.2014 / 19:09

3 respostas

3

Aqui está uma extensão do caso mais simples ao qual você se vinculou, usando uma matriz em awk

$ awk 'BEGIN{OFS="\t"} NR==FNR {a[$1]=$1;next;} \
    $1 in a {k=$1;$1="";a[k]=a[k]$0} END{for (i in a) print a[i]}' File3 File1 File2
AC      456324  DDDEE   YYUKI
DC      689712  AABBC   TTYJU

Ao contrário de join , não é necessária a pré-classificação dos arquivos no campo-chave.

    
por 10.07.2014 / 22:55
3

Você pode realizar isso de maneira justa com o comando join .

$ join -j 1 <(sort file3) <(sort file1) > tmp ; \
    join -j 1 <(sort tmp) <(sort file2) | sed 's/ /\t/g' > file4
  • Primeiro, uso join em arquivo3 e arquivo1 porque arquivo3 tem as chaves.
  • Agora, escrevo a saída do comando acima para tmp e agora, novamente, faço a junção em tmp e arquivo2 .
  • Agora, conforme o comando acima, a saída estará no formato delimitado por espaço.
  • Como seu requisito é um formato delimitado por tabulações, eu o alimentei ao comando sed , que substitui todos os espaços por tab.
  • Finalmente, eu escrevo para file4 conforme sua exigência.
por 10.07.2014 / 19:53
1

Se por "simples" você quer dizer que não precisa escrever muito código, existem muitas ferramentas como csvkit ou csvfix que podem ajudá-lo nisso - em particular, dê uma olhada no "join "sub-comandos que ambos fornecem.

Mas se você quis dizer que não deve ter nenhum requisito extra, não acho que exista uma maneira "simples". Pelo menos, definitivamente não vai ser um one-liner.

Além disso, este não é um problema que eu tentaria resolver usando apenas o bash, além dos utilitários padrão do Unix, de qualquer forma. Para coisas como essas, você está indo bem com o Python, na minha opinião - especialmente se o problema se tornar mais complexo.

    
por 10.07.2014 / 19:33

Tags