Unix: объединить 2 файла с использованием 2-х столбцов - PullRequest
5 голосов
/ 11 февраля 2011

Я хочу объединить два файла в соответствии с содержимым их 2-х столбцов.

Файл 1:

"4742"  "209220_at"     2.60700394801826
"104"   "209396_s_at"   2.60651442103297
"749"   "202409_at"     2.59424724783704
"4168"  "209875_s_at"   2.58773204877464
"3973"  "1431_at"       2.52832098784342
"1826"  "207201_s_at"   2.41685345240968

File2:

"653"   "1431_at"       2.14595534191867
"1109"  "207201_s_at"   2.13777517447307
"353"   "212531_at"     2.12706340284672
"381"   "206535_at"     2.11456707231618
"1846"  "204534_at"     2.10919474441178

Иметь в итоге:

"3973"  "1431_at"       2.52832098784342 "653"   "1431_at"       2.14595534191867
"1826"  "207201_s_at"   2.41685345240968 "1109"  "207201_s_at"   2.13777517447307

Я пытался comm, diff, некоторые неясные awk однострочные, но безуспешно. Любая помощь высоко ценится. Ben

Ответы [ 4 ]

5 голосов
/ 11 февраля 2011

Вы можете сделать это с помощью комбинации команд sort и join. Простой подход -

join -j2 <(sort -k2 file1) <(sort -k2 file2)

но это выглядит немного иначе, чем вы ищете. Он просто показывает общее поле соединения, а затем остальные поля из каждого файла

"1431_at" "3973" 2.52832098784342 "653" 2.14595534191867
"207201_s_at" "1826" 2.41685345240968 "1109" 2.13777517447307

Если вам нужен формат, точно такой, как вы показали, вам нужно указать join, что выведите таким образом

join -o 1.1,1.2,1.3,2.1,2.2,2.3 -j2 <(sort -k2 file1) <(sort -k2 file2)

, где -o принимает список спецификаторов FILENUM.FIELDNUM.

Обратите внимание, что используемый мной синтаксис <() не относится к POSIX sh, поэтому вам следует отсортировать по временному файлу, если вам нужен синтаксис POSIX sh.

2 голосов
/ 11 февраля 2011
awk '
  # store the first file, indexed by col2
  NR==FNR {f1[$2] = $0; next}
  # output only if file1 contains file2's col2
  ($2 in f1) {print f1[$2], $0}
' file1 file2
0 голосов
/ 12 февраля 2011
awk 'FNR==NR{a[$2]=$0} NR>FNR && ($2 in a){ print $0,a[$2] } ' file2 file1
0 голосов
/ 11 февраля 2011

Если файлы небольшие, напишите программу на языке сценариев (Perl, Python и Ruby - все хорошие варианты), который читает первое в хеш, ключи которого - второй столбец, затем читает второй файл и использует хеш поиск, чтобы выяснить, что (если что-нибудь) может быть присоединен.

Если файлы большого размера, то для каждого файла поменяйте местами первый и второй столбцы, пропустите их через утилиту сортировки unix, а затем объедините два отсортированных файла в языке сценариев (плюс перестановка столбцов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...