Здесь происходит следующее: после того, как вы печатаете результаты в последнем операторе awk, массив a[]
больше не находится в области видимости, и поэтому второе значение не печатается.
Возможно, есть и другой способ сделать это awk
, но это решение, которое я придумал:
for each in $(comm -1 -2 <(awk '{print $1 }' file1.txt | sort ) <(awk '{print $1 }' file2.txt | sort) ); do echo $(grep $each file2.txt | awk '{print $2}') $(grep $each file1.txt | awk '{print $2}') ; done;
Это выводит:
foo 1589.0
hi 33.7
Пояснение:
- Запустите команду
comm
для двух файлов.
- Два «файла», переданные
comm
, на самом деле замещаются процессом, поэтому они сортируются первыми (comm
ожидает отсортированный ввод) и отображается только первый столбец.
- Параметры
-1 -2
для comm
предписывают ему печатать только общие элементы из файлов (он может отображать элементы, уникальные для первого файла, уникальные для второго файла или общие для обоих)
- Как только у вас есть общие элементы из обоих файлов,
for each
из этих общих элементов, продолжайте и grep каждого файла для строки, где он появляется, и отображайте только второе значение, используя awk.
Итак, в конце нам понадобился цикл bash for
, sort
, comm
и awk
несколько раз. Возможно, это не самое элегантное решение, но оно выполняет свою работу.