AWK: pesquisa a última coluna do texto INPUT.txt no TABLEs e adicione colunas correspondentes ao INPUT.txt

0

querida Eu tenho INPUT.txt como isso (veja a última coluna)

INPUT.txt
63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

e dois textos TABLE como este.tem duas colunas.

TABLE1.txt
j feat1
a feat2
.
.
.

e

TABLE2.txt
j sp1
a sp2
.
.

Eu quero adicionar duas colunas ao INPUT.txt. pesquise a última coluna de INPUT.txt no texto TABLEs e adicione colunas correspondentes a INPUT.txt. (acho que pode mearge TABLEs como j feat1 sp1) e saída assim

output.txt
CodeGender Age Grade Dialect Session Sentence Start End Length Phonemic     Phonetic feat sp
63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]
.
.
.
    
por reza ali 27.01.2018 / 07:25

3 respostas

0

Se você tem o GNU awk, você pode usar uma versão mutlidimensional do canônico NR==FNR {a[$1]=$2; next} $NF in a {print $0, a[$NF]} com as seguintes modificações:

  1. você não pode usar o truque NR==FNR para decidir se está criando ou usando a tabela de pesquisa; você precisará contar quantos arquivos foram processados

  2. você precisará fazer um loop explicitamente sobre o índice primário e testar a chave de correspondência em cada subarray

Ex.

gawk '
  BEGINFILE{k++}
  k<3 {a[k][$1]=$2; next} 
  {nf = NF; for (l in a) {if ($nf in a[l]) {$(NF+1) = a[l][$nf]}}}
  {print}
' TABLE1.txt TABLE2.txt INPUT.txt 

63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]

Se você quiser cabeçalhos de coluna, imprima-os em uma regra BEGIN .

    
por 27.01.2018 / 15:13
0

Você pode tentar este awk também

awk '
FILENAME!=fn{
  a[$1]=a[$1]FS$2
  next
}
$NF in a{
  $0=$0a[$NF]
}
1
' fn='INPUT.txt' TABLE1.txt TABLE2.txt INPUT.txt
    
por 27.01.2018 / 16:09
0

Eu fiz isso abaixo das 2 etapas

passo1

awk 'FNR==NR{a[FNR]=$2;next};{$(NF + 1)=a[FNR]}1' file1 input.txt  >> final_final.txt

passo 2

awk 'FNR==NR{a[FNR]=$2;next};{$(NF + 1)=a[FNR]}1' file2 final_final.txt

saída

63 M 27 BS/BA TEHRANI 3 4 298320 310050 11730 j j feat1 sp1
63 M 27 BS/BA TEHRANI 3 4 310050 311430 1380 ( a feat2 sp2
63 M 27 BS/BA TEHRANI 3 4 311430 312080 650 ] ]
    
por 27.01.2018 / 17:39