Двухфайловая обработка в awk - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть файл:

result.txt

Apple fruits 10 20 30
Car  vehicle 40 50 60
Book study  70 80 90

Предположим, что 2-й столбец - это особенность, 3-й столбец - Мин, 4-й столбец - Медиана, 5-й столбец - Макс.У меня есть другой файл config.txt, который содержит свойство для каждой функции, т.е.

config.txt

fruits Max
vehicle Median
study Min

Так что я хочу написать скрипт, который показывает только этот номер столбца для функции, котораяопределяется в config.txt файле.

Ожидаемый результат:

Apple fruits 30
Car vehicle 50
Book study 70

Я перехожу по этой ссылке https://stackoverflow.com/a/40206489/10220825. Вот что я пробовал:

awk 'FNR==NR{arr[$2];next} $1 in arr {var =$2;print var}' result.txt config.txt

Я могу держать свойство (например, Min, Max, Median) в переменной для соответствующей функции, определенной в result.txt, но не могу отобразить столбец для этой переменной.Пожалуйста, предложите мне подход к печати столбца для соответствующего столбца.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019
$ awk 'BEGIN   {m["Min"]=3; m["Median"]=4; m["Max"]=5} 
       NR==FNR {a[$1]=$2; next}
               {print $1,$2,$m[a[$2]]}' config result

Apple fruits 30
Car vehicle 50
Book study 70

вам нужно сохранить карту min / median / max для соответствующего индекса столбца и просмотреть в файле конфигурации, какое значение нужно распечатать.

добавить a[$2] к печати, еслиВы хотите напечатать информацию о Max / Min / Median.

NR==FNR {a[$1]=$2; next} - это идиома awk для загрузки file1 в массив, индексированный с первым полем и полем два в качестве значений, по существу, словарь или справочная таблица.

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

Вы также можете попробовать Perl

perl -lane ' BEGIN { @kv{qw(Min Median Max)}=(2,3,4);
            %kw=map{chomp;split} qx(cat ratnesh_config.txt) } 
            $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in.txt

с заданными значениями:

$ cat ratnesh_config.txt
fruits Max
vehicle Median
study Min

$ cat ratnesh_in.txt
Apple fruits 10 20 30
Car  vehicle 40 50 60
Book study  70 80 90

$ perl -lane 'BEGIN { @kv{qw(Min Median Max)}=(2,3,4);%kw=map{chomp;split} qx(cat ratnesh_config.txt) } $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in.txt

Apple fruits 30
Car vehicle 50
Book study 70

$ perl -lane 'BEGIN { $kv{Min}=2;$kv{Median}=3;$kv{Max}=4;%kw=map{chomp;split} qx(cat ratnesh_config.txt) } $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in
.txt
Apple fruits 30
Car vehicle 50
Book study 70

$ perl -lane 'BEGIN { @kv{qw(Min Median Max)}=(2,3,4);%kw=map{chomp;split} qx(cat ratnesh_config.txt)} $p=$kv{$kw{$F[1]}}; print "@F[0,1,$p]" ' ratnesh_in.txt
Apple fruits 30
Car vehicle 50
Book study 70

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

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

awk '
FNR==NR{
  a[$2,"max"]=$1 OFS $5
  a[$2,"min"]=$1 OFS $3
  a[$2,"median"]=$1 OFS $4
  next
}
{
  $2=tolower($2)
}
(($1,$2) in a){
  split(a[$1,$2],array," ")
  print array[1],$1,array[2]
}' SUBSEP=" "  results.txt config.txt

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

Apple fruits 30
Car vehicle 50
Book study 70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...