С awk вы можете сделать что-то вроде
awk -F \| 'BEGIN { OFS = FS } NR == FNR { val[$2] = $1; next } $1 in val { $(NF + 1) = val[$1]; print }' file2 file1
NF
— это количество полей в записи (по умолчанию строка), поэтому $NF
— это последнее поле, а $(NF + 1)
— поле после него. Присвоив ему сохраненное значение из прохода через file2
, новое поле добавляется к записи перед ее печатью.
Следует отметить одну вещь: это ведет себя как внутреннее соединение, т. е. печатаются только те записи, ключ которых присутствует в обоих файлах. Чтобы сделать это правильным соединением, вы можете использовать
awk -F \| 'BEGIN { OFS = FS } NR == FNR { val[$2] = $1; next } { $(NF + 1) = val[$1]; print }' file2 file1
То есть вы можете отказаться от условия $1 in val
в действии добавления и печати. Если $1
не находится в val
, val[$1]
пусто, и перед печатью к записи будет добавлено пустое поле.
Но, вероятно, лучше использовать join
:
join -1 1 -2 2 -t \| file1 file2
Если вы не хотите, чтобы ключевое поле было частью вывода, направьте вывод любой из этих команд через cut -d \| -f 2-
, чтобы избавиться от него, т.е.
join -1 1 -2 2 -t \| file1 file2 | cut -d \| -f 2-
12.02.2015
-o 1.2,1.3,1.4,2.2
12.02.2015$(NF+1)
. Вы можете сделать его более неудобным, переместив выражение if за скобки:$1 in val { $(NF + 1) = val[$1]; print }
12.02.2015cut
, чтобы сбрить ключевое поле из вывода; вариант-o
может решить проблему, как указано, и имеет свои преимущества, но я чувствую, что преимущество подходаcut
в том, что он работает с произвольным количеством столбцов, перевешивает их здесь. Однако, если бы производительность была заявлена как проблема, все могло бы быть иначе. 12.02.2015file2
(по сути, это ведет себя как внутреннее соединение). Если вы хотите, чтобы строки, не имеющие значения вfile2
, печатались с пустым полем, используйте{ $(NF + 1) = val[$1] }
без условия$1 in val
. 12.02.2015