Здесь та же основная идея, что и awk
в ответ Archemar , реализованная на Perl:
$ perl -lane '$#F>1?print"$l{$F[0]} @F[1..$#F]":($l{$F[0]}=$F[1])' file2 file1
rs435 51 2 27.92464882 8.63E-07
rs564 82 2 30.12532071 2.87E-07
rs654 90 2 29.26089611 4.43E-07
rs345 90 2 28.56723908 6.26E-07
rs665 104 2 28.27577506 7.24E-07
rs787 100 2 28.16226794 7.67E-07
rs435 50 2 27.92464882 8.63E-07
-lane
: -l
добавляет новую строку к каждому вызову print
и удаляет завершающие новые строки из каждой строки ввода. -a
заставляет perl
действовать как awk
: он автоматически разбивает каждую входную строку на массив @F
. Таким образом, первое поле будет $ F [0]
, второе $ F [1]
и т. Д. -n
указывает perl на чтение входного файла. (s) построчно и примените сценарий, указанный с помощью -e
, к каждому из них.
$ # F> 1? ...: ...
: это условный оператор в стиле C. Общий формат условие? foo: bar
, что означает «если условие
истинно, выполните foo
, а если нет, то выполните bar
. $ # F
- это количество индексов в массиве @F
. Поскольку массивы начинаются с 0
, значение 1
означает массив с двумя элементами. . Итак, это выполнит первый блок ( print ...
, см. Ниже), если в массиве более двух элементов, что будет верно только для file1
.
($ l {$ F [0]} = $ F [1])
: это выполняется для каждой строки файла file2, для каждой строки с менее чем 3 полями.Он заполняет хэш % l
, ключи которого являются числовыми первыми полями file2
, а значения - соответствующими rsID. print "$ l {$ F [0]} @F [1 .. $ # F]"
: вывести rsID, сохраненный в хэше % l
для этого первого поля ( $ l {$ F [0]}
), пробел, а затем остальные поля в этой строке ( $ F [1 .. $ # F]
). Лично я, вероятно, использовал бы решение awk
или, в худшем случае, решение perl
, которое я предоставил, поскольку им не нужно сортировать файлы. Однако, поскольку вы отметили join
, вот как это сделать с помощью этого инструмента:
$ join -o 2.2 1.2 1.3 1.4 1.5 <(sort file1) <(sort file2)
rs787 100 2 28.16226794 7.67E-07
rs665 104 2 28.27577506 7.24E-07
rs435 50 2 27.92464882 8.63E-07
rs435 50 2 27.92464882 8.63E-07
rs435 51 2 27.92464882 8.63E-07
rs435 51 2 27.92464882 8.63E-07
rs564 82 2 30.12532071 2.87E-07
rs345 90 2 28.56723908 6.26E-07
rs654 90 2 29.26089611 4.43E-07
Конечно, вы можете легко запустить Node.js на EndlessOS .
Flathub— это репозиторий, использующийFlatpak.
Из этого репозитория вы можете установить Podman , а с помощью Podman вы можете установить Node.js
В качестве бонуса, потому что вы используете контейнер. Его будет легко развернуть на нескольких платформах.
Ссылки