Как добавить в файл столбец, соответствующий другому столбцу?

Как добавить в файл столбец, соответствующий другому столбцу?

Как мне сопоставить первый столбец из файла 1 по числам во втором столбце с файлом 2?

Файлфайл1

k002  25
k004  54
k003  23

Файлфайл2

25 h
23 j
54 hg

Желаемый результат

k002 25 h
k003 23 j
k004 54 hg

Я понятия не имею, как это сделать, и похожих вопросов не нашел.

awk 'matching {print ... $1, $2}' file1 file2 > file_des

решение1

Возможно, вы могли бы сделать что-то вроде этого:

awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2

Где:

  • FNR: Номер входной записи в текущем входном файле.
  • NR: Общее количество просмотренных на данный момент входных записей.

Обратите внимание, что это будет полностью прочитано file1в памяти.

решение2

Если вам не важно сохранение исходного порядка файлов, вы можете использовать join:

# sort the first file:
sort -k2 file1 > nfile1

# Sort the second file:
sort file2 > nfile2

join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file

Или, как предложил @Ed Morton, если вы используете bashили любую другую оболочку, поддерживающую замену процессов, вы можете избежать создания временных файлов следующим образом:

join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)

решение3

С использованием awk:

awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2

В этой команде NR==FNRгарантируется, что {ar[$2]=$0;next}будет работать только для первого файла, потому что после чтения первый файл FNRбудет установлен в ноль. В выражении создается индексированный {ar[$2]=$0;next}массив , и никаких дальнейших действий не выполняется.ar$2next

Выражение ($1 in ar)проверяет, $1присутствует ли (первое поле второго файла) виндексымассива ar. Если присутствует, то печатает arвторое поле второго файла этим оператором {print ar[$1],$2}.

($1 in ar)важно, потому что это означает, соответствует ли $1 второго файлаиндексыиз ar. И arиндексируется по $2 первого файла. Так что это проверяет, $1совпадает ли второй файл $2с первым файлом.

Связанный контент