Нет, bash -l
не отображает сообщение дня. Из справочной страницы motd(5)
:
NAME motd - message of the day
DESCRIPTION The contents of /etc/motd are displayed by pam_motd(8) after a successful login but just before it executes the login shell.
Чтобы это делала ваша оболочка, добавьте cat /etc/motd
в свой профиль или rc-файл оболочки.
Должен быть комментарий Эду Мортону, но слишком большой и, возможно, представляющий более общий интерес.
Я написал простую пятиминутную -минутную работу для ОП, который не мог приступить к работе, увидев два бесполезных комментария. Меня не очень впечатлила ваша ссылка, содержащая альтернативы, вызывающие рвоту, например:
awk 'c&&!--c;/3/{c=5}/4/{print "Eureka!"}' file
Я указал, что возможны лучшие методы, и опубликовал и протестировал код.
Конечно, getline здесь не обязателен, но он обеспечивает определенную симметрию операций. Если вы полагаетесь на цикл awk, вы в конечном итоге используете что-то вроде FNR % 2 == 1 для работы со строго чередующимися строками. Это отстой, поэтому я бы предпочел игнорировать «две строки» OP и группировать строки по LocusID для общности.
Я возвышаю awk-скрипты, помещая их в переменные оболочки, потому что они лучше читаются. Я ненавижу большой awk-код, помещенный в командную строку и свернутый в странных местах. Кроме того, это действительно взламывает системных администраторов, потому что весь awk отображается в ps -ef и очищает вывод (в SunOS, который он использовал для сбоя ps, потому что у него была фиксированная максимальная длина строки ).
Моя обычная идиома для предотвращения этого в bash была бы:
awk -f <( echo "${AWK}" )
, который ps указывает как awk -f /dev/fd/63, удобно скрывая мой собственный код от любознательных.
Я никогда не отделяю команду оболочки от awk. :Я никогда не использую файл.awk. Произойдет одна из двух плохих вещей:
(a )Вы предоставляете файл.awk и ожидаете, что пользователь введет команду awk (, возможно, включая ' -F|' или какой-нибудь другой вариант ), и он ПОЛУЧИТ это неправильно.
(b )Вы предоставляете пользователю файлы.sh и.awk, возникает проблема с обновлением, и он получает несоответствие между файлами.
По тем же причинам, если мне нужно предоставить справочную страницу, я встраиваю ее в сам сценарий, как функции Usage и Help, содержащие документы Here.
Я прекрасно понимаю, что '''...''' не нужно. Тем не менее, мне надоело публиковать одиночные -цитируемые решения и заставлять людей думать: «Там пропущена цитата, я это исправлю», искажая мой проверенный пост, а затем жалуясь, что это не сработало. Запутывание его парой пустых строк удерживает людей от возни с ним и увеличивает видимость.
После 40 лет работы в Unix я знаю зарезервированные переменные в shell и awk. У меня есть хорошие правила для именования, но для тривиальной проблемы я предпочитаю использовать термины, которые может интуитивно понять ОП. Две строки, два вектора. Я использую заглавные буквы для многих переменных оболочки для видимости, чтобы отличить их от ключевых слов. Кто угодно может написать ключевые слова :почти все баги из-за того, что кодеры не видят данных, они не акцентируют роль переменных.
Getline не дает мне неожиданных сбоев, потому что я знаю, чего ожидать. Вам могут не понравиться идиомы, которые я использую, но это не делает их неправильными. Это решения проблем, с которыми я сталкивался на протяжении многих лет.
Мой совет :превратить пробелы в запятые, чтобы у вас был CSV, а затем загрузить его в базу данных.
Используя psql
и Postgres и файл, который вы указали как temp.csv
, это выглядит так:
postgres=> create temp table d (locusid text, f int, n_alleles int, x float, y float);
CREATE TABLE
postgres=> \copy d from program 'tr " ", < temp.csv' with (format csv, header true)
COPY 8
postgres=> table d;
locusid | f | n_alleles | x | y
----------+---+-----------+---------+----------
2L:8347 | 1 | 2 | 44.3166 | -12.2373
2L:8347 | 1 | 2 | 39.2667 | -6.8333
2L:31184 | 1 | 2 | 39.2667 | -6.8333
2L:31184 | 1 | 2 | 39.2667 | -6.8333
2L:42788 | 1 | 2 | 39.2667 | -6.8333
2L:42788 | 1 | 2 | 39.2667 | -6.8333
2L:42887 | 1 | 2 | 39.2667 | -6.8333
2L:42887 | 1 | 2 | 39.2667 | -6.8333
(8 rows)
postgres=> select d.* from d join d as d2 on d.locusid = d2.locusid and (d.x != d2.x or d.y != d2.y);
locusid | f | n_alleles | x | y
---------+---+-----------+---------+----------
2L:8347 | 1 | 2 | 44.3166 | -12.2373
2L:8347 | 1 | 2 | 39.2667 | -6.8333
(2 rows)