как печатать только те строки, когда значения столбцов не идентичны?

Нет, 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-файл оболочки.

-1
18.11.2019, 02:19
2 ответа

Должен быть комментарий Эду Мортону, но слишком большой и, возможно, представляющий более общий интерес.

Я написал простую пятиминутную -минутную работу для ОП, который не мог приступить к работе, увидев два бесполезных комментария. Меня не очень впечатлила ваша ссылка, содержащая альтернативы, вызывающие рвоту, например:

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 не дает мне неожиданных сбоев, потому что я знаю, чего ожидать. Вам могут не понравиться идиомы, которые я использую, но это не делает их неправильными. Это решения проблем, с которыми я сталкивался на протяжении многих лет.

0
28.01.2020, 05:11

Мой совет :превратить пробелы в запятые, чтобы у вас был 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)
0
28.01.2020, 05:11

Теги

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