Как мне сопоставить первый столбец из файла 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
$2
next
Выражение ($1 in ar)
проверяет, $1
присутствует ли (первое поле второго файла) виндексымассива ar
. Если присутствует, то печатает ar
второе поле второго файла этим оператором {print ar[$1],$2}
.
($1 in ar)
важно, потому что это означает, соответствует ли $1 второго файлаиндексыиз ar
. И ar
индексируется по $2 первого файла. Так что это проверяет, $1
совпадает ли второй файл $2
с первым файлом.