Создать новую оболочку bash из сценария .sh

Здесь та же основная идея, что и 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

Explanation

  • -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

1
31.05.2019, 22:26
1 ответ

Конечно, вы можете легко запустить Node.js на EndlessOS .

Flathub— это репозиторий, использующийFlatpak.

Из этого репозитория вы можете установить Podman , а с помощью Podman вы можете установить Node.js

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

Ссылки

https://podman.io

0
28.01.2020, 00:11

Теги

Похожие вопросы