Eu tenho 2 arquivos, a primeira linha é uma linha de cabeçalho para referência
file1
userId userContact parentId parentContact 200 0900200 100 - 201 0900201 100 - 300 0900300 101 -
file2
userId userContact parentId parentContact 100 0900100 100 - 101 0900101 100 -
Eu quero preencher a 4ª coluna de file1
, para que ele tenha que pesquisar em $3
de e, em seguida, trazer de no lugar de para
que a saída fique assim:file1
$1
file2
$2
file2
$4
file1
output
userId userContact parentId parentContact 200 0900200 100 0900100 201 0900201 100 0900100 300 0900300 101 0900101
Eu prefiro awk
, pois será mais rápido.
Usando
join
(requer arquivos de entrada classificados, então passamos entradas classificadas).Com
-1 3
, join seleciona a 3ª coluna como chave do primeiro arquivo de entrada (arquivo1), e com-2 1
seleciona a 1ª coluna como chave do segundo arquivo de entrada (arquivo2); em seguida, ele-o
gera essas colunas <file#>.<column#> .Se suas entradas forem arquivos delimitados por tabulação, adicione
-t$'\t'
ao comando join, bem como ao arquivosort -k3 file1
.se você quiser que a linha de cabeçalho seja impressa, adicione
head -n1 file1;
antes da junção.Ou usando
awk
:Isso lê em
file2
, armazenando o campo 2 de cada linha em um array chamadokeep
(indexado pelo valor do campo 1). Assim que terminar de lerfile2
, ele começa a lerfile1
. Ele imprime a primeira linha (linha de cabeçalho) e, em seguida, para cada linha de entrada subsequente, altera o campo 4 para o valorkeep[$3]
e o imprime.O script detecta se está lendo
file2
ou não com oNR==FNR
teste. A variável de awkFNR
contém o número de linha atual do arquivo atual, enquantoNR
contém o número de linha total cumulativo de todos os arquivos lidos até agora. Então, se FNR for igual a NR, estamos lendo o primeiro arquivo (ou sejafile2
- e é por isso que ele deve ser listado como o primeiro nome de arquivo arg). Existem algumas circunstâncias bastante obscuras em que este teste não funciona muito bem, mas é bom para a maioria das circunstâncias (incluindo esta).Se você precisar alterar os separadores de campo de entrada ou saída, você pode usar as opções -F e -v do awk. por exemplo
-F'\t'
e/ou-v OFS='\t'
.