Печать контента в двух файлах, обработка в awk - PullRequest
0 голосов
/ 22 февраля 2019

Я ссылаюсь на эту ссылку https://stackoverflow.com/a/54767231/11084572. У меня есть config file, где 2nd column is feature и 3rd column is action.У меня есть еще один большой файл, в котором мне нужно сопоставить 1-й столбец этого файла с 1-м столбцом config file и выполнить действие в соответствии с функцией.

Допущение: в столбце File.txt имена имеют вид Min (3rd col),Median (4th), Max(5th)

Config.txt

Apple  All  Max
Car    abc  Median
Car    xyz  Min
Book   cvb  Median
Book   pqr  Max

File.txt

Apple  first   10  20  30
Apple  second  20  30  40
Car    abc     10  20  30
Car    xyz     20  30  40
Car    wxyz    10  20  30
Book   cvb     60  70  80
Book   pqr     80  90  100

Ожидаемый вывод:

Apple  first   30
Apple  second  40
Car    abc     20
Car    xyz     20
Car    wxyz    10
Book   cvb     70
Book   pqr     100

Вышеуказанный вывод генерируется наПодход followinfg:

1) Поскольку file.txt большой, поэтому, если свойство (2-я колонка) config file равно ALL, то все соответствующие 1-й столбец будут выполнять действие в соответствии с 3-й колонкойconfig file.

2) В противном случае он работает, если 2-й столбец config file соответствует **substring** второму столбцу file.txt

Вот что я пробовал:

awk 'BEGIN {m["Min"]=3;m["Median"]=4;m["Max"]=5}

        NR==FNR{ arr[$1]=$2;brr[$1]=$3;next}
                ($1 in arr && arr[$1]=="All") {print $1,$2,$m[brr[$1]]}
                ($1 in arr && $2==arr[$1] ) {print $1 ,$2,$m[brr[$1]]}
' Config.txt File.txt

Вывод кода:

Apple  first   30
Apple  second  40
Book   pqr     100
Car    xyz     20 

Вышеуказанный вывод печатает только одно поле соответствующего 1-го столбца (например, Book cvb 70 не печатает).Также, как я мог сопоставить строку как конечную строку (например, xyz, определенный в config.txt, соответствует обоим xyz and wxyz файла file.txt.

Пожалуйста, помогите мне решить вышеупомянутую проблему. Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Ваш ожидаемый пример выходных данных НЕ выглядит в соответствии с показанным образцом Input_file (например, -> Car abc 200, где NO 200 в file.txt), если я получил его правильно, не могли бы вы попробовать.

awk '
BEGIN{
  b["min"]=3
  b["max"]=5
  b["median"]=4
}
FNR==NR{
  c[$1]
  ++d[$1]
  a[$1 d[$1]]=tolower($NF)
  next
}
($1 in c){
  if(e[$1]<d[$1]){
      ++e[$1]
  }
  else{
      e[$1]!=""?e[$1]:++e[$1]
  }
  print $1,$2,$b[a[$1 e[$1]]]
}' config.txt file.txt

Вывод будет следующим.

Apple first 30
Apple second 40
Car abc 20
Car xyz 20
Car wxyz 10
Book cvb 70
Book pqr 100

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

awk '                                       ##Starting awk program here.
BEGIN{                                      ##Mentioning BEGIN section here which will be executed once and before reading Input_file only.
  b["min"]=3                                ##Creating an array named b whose index is string min and value is 3.
  b["max"]=5                                ##Creating an array named b whose index is string max and value is 5.
  b["median"]=4                             ##Creating an array named b whose index is string median and value is 4.
}                                           ##Closing BLOCK section here.
FNR==NR{                                    ##Checking condition FNR==NR which will be executed when 1st Input_file named config.txt is being read.
  c[$1]                                     ##Creating an array named c whose index is $1.
  ++d[$1]                                   ##Creating an array named d and with index is $1 whose value is keep increasing with 1 on its each occurence.
  a[$1 d[$1]]=tolower($NF)                  ##Creating an array named a whose index is $1 and value of d[$1] and value is small letters value of $NF(last column) of current line.
  next                                      ##Using next keyword of awk to skip all further statements from here.
}
($1 in c){                                  ##Checking conditions if $1 of current line is present of array c then do following.
  if(e[$1]<d[$1]){                          ##Checking condition if value of e[$1] is lesser than d[$1] then do following.
      ++e[$1]                               ##Creating array named e whose index is $1 and incrementing its value with 1 here.
  }
  else{                                     ##Using else for above if condition here.
      e[$1]!=""?e[$1]:++e[$1]               ##Checking if e[$1] is NULL then increment it with 1 or leave it as it is.
  }
  print $1,$2,$b[a[$1 e[$1]]]               ##Printing 1st, 2nd fields value along with field value of array b whose index is value of array a with index of $1 e[$1] here.
}' config.txt file.txt                      ##Mentioning Input_files here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...