Lê uma coluna de um arquivo e acrescenta uma coluna específica de outro arquivo

2

Eu tenho dois arquivos assim:

fileA:

Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW

FileB:

NE_Name       SW   
ABC           4.4
ASD           4.3
...           ...

Observe que fileA consiste apenas em uma única linha e possui vários cabeçalhos (por exemplo, Name, Site Name etc.). Considerando que, o arquivo B tem 2 campos com grande número de linhas.

Eu quero combinar esses dois arquivos assim:

Arquivo de saída:

Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,4.4
ASD,,,,,,4.3

Assim, o arquivo de saída teria todos os cabeçalhos presentes no arquivo A e expandiria os campos: 'Nome' (com os valores 'NE_Name' obtidos do arquivo B) e 'SW' (com os valores 'SW' obtidos do arquivo B) .

Como posso obter esse arquivo de saída dos dois arquivos de entrada mencionados acima?

    
por Murat 23.07.2015 / 16:03

3 respostas

2

Aqui está uma maneira com awk :

$ awk -F, 'NR==1{nf=NF-1; print $0; FS=" "} \
         NR>2{printf("%s%.*s%s\n",$1,nf,",,,,,,,,,,,,,,,,,",$2)}' fileA fileB

Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,4.4
ASD,,,,,,4.3

A parte crucial é printf , onde imprimimos os primeiros e terceiros campos do arquivo B separados por , , cujo número é obtido do primeiro arquivo como nf=NF-1 .

    
por 23.07.2015 / 16:45
2
tail -n+2 fileB | sed -r 's/[[:space:]]+/,,,,,,/' | cat fileA - > Output

Explicações

tail -n +2 fileB escreve o final do arquivo B, iniciando na segunda linha, pois queremos ignorar a primeira linha.

sed , usando -r, --regexp-extended (para o significado de meta caracteres + ' pelo menos um ') substitui o primeiro grupo de caracteres de espaçamento pela quantidade esperada de vírgulas a partir do seu exemplo.

cat finalmente concatena o arquivoA e os dados recebidos de sed pelo canal, referido como - , e grava em stdout , que é redirecionado para o arquivo Output a partir de sua solicitação.

Limitações

Não funcionará se houver caracteres de espaço nas colunas NE_Name ou SW.

    
por 23.07.2015 / 16:28
1

Outra abordagem sed :

$ sed 's/   */,,,,,,,/;/NE_/d' fileA fileB
Name,Site Name,Product UPEI,Product Name,NMS Flag,Product Model, SW
ABC,,,,,,,4.4
ASD,,,,,,,4.3

O primeiro comando sed substitui 3 ou mais espaços por 7 vírgulas e o segundo remove qualquer linha correspondente a NE_ .

    
por 23.07.2015 / 21:03