Объединить два файла одним столбцом AWK - PullRequest
0 голосов
/ 21 февраля 2020

Я хотел бы объединить 4-й столбец file1 с file2 1-й столбец с awk, и я хотел бы напечатать 2-й столбец из файла $ 1. Если более одного совпадения (может быть больше 100), выведите его через запятую.

FILE1:

alo descrip 1  PAPA
alo descrip 2  LOPA
alo descrip 3  REP
alo descrip 4  SEPO
dlo sapro   31 REP
dlo sapro   35 PAPA

FILE2:

PAPA klob trop
PAPA kopo topo
HOJ  sasa laso
REP  deso rez
SEPO raz  ghul
REP  kok  loko

OUTPUT:

PAPA klob trop descrip,sapro
PAPA kopo topo descrip,sapro
HOJ  sasa laso NA
REP  deso rez  descrip,sapro
SEPO raz  ghul descrip
REP  kok  loko descrip,sapro

Я пытался:

awk -v FILE_A = "FILE1" -v OFS = "\ t" 'BEGIN {while ((getline 0) { VAL = 0 долларов США; sub (/ ^ [^] + /, "", VAL); DICT [$ 1] = VAL}} {print $ 0, DICT [$ 4]} 'FILE2

, но это не работает.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

По сути, вопрос заключался в том, как хранить данные в массиве при наличии дублированных ключей. @ RavinderSingh13 великолепно продемонстрировал, как добавлять данные в индексированные элементы массива. Другой способ - использовать многомерные массивы. Вот пример того, как использовать их в GNU awk:

$ gawk '                                               # using GNU awk
NR==FNR {                                              # process first file
    a[$4][++c[$4]]=$2                                  # 2d array
    next
}
{                                                      # process second file
    printf "%s%s",$0,OFS                               # print the record
    if($1 in a)                                        # if key is found in array
        for(i=1;i<=c[$1];i++)                          # process related dimension
            printf "%s%s",a[$1][i],(i==c[$1]?ORS:",")  # and output elements
    else                                               # if key was not in array
        print "NA"                                     # output NA
}' file1 file2
2 голосов
/ 21 февраля 2020

Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  a[$NF]=(a[$NF]?a[$NF] ",":"")$2
  next
}
{
  printf("%s %s\n",$0,($1 in a)?a[$1]:"NA")
}
'  Input_file1  Input_file2

Объяснение: Добавление подробного объяснения для приведенного выше кода.

awk '                                          ##Starting awk program fro here.
FNR==NR{                                       ##Checking condition FNR==NR whioh will be TRUE when Input_file1 is being read.
  a[$NF]=(a[$NF]?a[$NF] ",":"")$2              ##Creating arra a with index $NF, its value is keep appending to its own value with $2 of current line.
  next                                         ##next will skip all further lines from here.
}
{
  printf("%s %s\n",$0,($1 in a)?a[$1]:"NA")    ##Printing current line then either value of array or NA depending upon if condition satisfies.
}
'  Input_file1 Input_file2                     ##Mentioning Input_file names here.
...