Использование массивов в awk для сопоставления строк - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь использовать awk для сопоставления двух файлов (файл1 и файл2).Для каждой строки столбца в file2, которая соответствует file1, я бы хотел, чтобы команда распечатала второй столбец в file1.

Я рассмотрел несколько решений здесь и нашел что-то, что сработало (частично), но Я не понимаю, как это работает.

awk 'NR==FNR {a[$1]=$2; next} $1 in a{print a[$1]}' file1 file2 >> output

Вот пример ввода:

#File1
0_1   apple
0_2   mango
0_3   banana
...
3_1   durian
3_4   dragonfruit
3_20  pear
#File2
0_1   3_1
0_1   3_1
0_2   3_4
0_3   3_20

Команда awk выше возвращает желаемый результат, когда я сопоставляю первый столбец File2 с File1.

#Output
apple
apple
mango
banana

Поэтому, естественно, я немного изменил строку, чтобы сделать то же самое для второго столбца в File2.

awk 'NR==FNR {a[$1]=$2; next} $2 in a{print a[$1]}' file1 file2 >> output

Но я получаю те же результаты, что и выше, когда я ожидаю:

#Expected output
durian
durian
dragonfruit
pear

Что еще хуже, я получаю желаемоевывод, когда я делаю это:

awk 'NR==FNR {a[$1]=$2; next} $1 in a{print a[$2]}' file1 file2 >> output

Может кто-нибудь объяснить мне логику этого (присвоение значений массивам) или что-то пошло не так в другом месте?

1 Ответ

1 голос
/ 27 марта 2019

Не могли бы вы пройти через следующее объяснение кода, используемого вами.Это может помочь вам понять концепцию массива.

awk '                      ##Starting awk program from here.
NR==FNR{                   ##Checking condition FNR==NR which will be TRUE once first Input_file named file1 is being read.
  a[$1]=$2                 ##Creating an array named a whose index is $1 of current line and value is $2(2nd field) of current line.
  next                     ##next will skip all further statements from here.
}                          ##Closing BLOCK for FNR==NR condition here.
$2 in a{                   ##Checking condition(which will be executed only when 2nd Input_file named file2 is being read.
  print a[$1]              ##Now printing value of array a whose index is $1 of current line.
}                          ##Closing BLOCK for $2  in a condition here.
' file1 file2 >> output    ##Mentioning Input_file names and placing output into output file here.

Дополнительное объяснение концепции массива:

  • Что делает a[$1]=$2? Это означает, что мы создаем массив с именем, чей индекс (по которому распознается любой элемент) и его значение равно $ 2 (2-е поле текущей строки).
  • Пример a[$1]=$2: Давайте рассмотрим пример 0_1 apple из 1-го Input_file, где массив будет храниться как a[0_1]=apple, как объяснено выше, его индекс равен 0_1и значение равно apple.
  • Что делает условие $2 in a? Этот оператор на самом деле является условием, которое проверяет, поступает ли $ 2 текущей строки в массив a(конечно, он проверяет все индексы массива a и сравнивает эту строку с ними, если они совпадают или нет), если найдено какое-либо совпадение, выведите значение массива a, значение которого равно a[$1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...