Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2025

Подсказки по программам

grep

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

tr

Программа tr ничего не знает о структуре текста, она умеет только заменять (и удалять) все вхождения символа на другой символ. Можно заменять сразу несколько разных символов, но это не значит, что можно заменять конкретные слова! Если вы попытаетесь заменить все вхождения AB, то заменятся все A и все B.

Еще можно заменять управляющие символы (типа табулятора и переноса строки), какие обозначения понимает tr описано в мануале.

uniq

А у uniq есть одна важная особенность, из-за которой эту программу можно использовать почти исключительно в связке с sort. Про это тоже можно прочитать в man uniq – последний абзац раздела DESCRIPTION, начинающийся с Note: ...

sort

При числовой сортировке с помощью sort все строки, не являющиеся числами, считаются эквивалентными нулю.

bash

У bash есть неинтерактивный режим работы, в котором он исполняет команды, прочитанные из текстового файла. Такие файлы с набором команд называют сценариями (или, в разговорном стиле, скриптами). Чтобы запустить сценарий на исполнение, нужно передать его команде bash в качестве аргумента.

$ bash ~/term1/credits/pr5.sh

В результате запустится новый процесс bash, который будет считывать строчки из файла и интерпретировать их в качестве команд. Поэтому в файле не должно быть постороннего текста! Допускаются только пустые строки для визуального разделения команд.

Крайне важно, чтобы сценарий имел разделители строк в формате Unix!

На самом деле нет никаких умолчательных значений для стандартных потоков ввода/вывода программ. Все программы, которые запускает bash, наследуют его стандартные потоки ввода/вывода, если в команде не были указаны никакие перенаправления. При запуске bash в интерактивном режиме его стандартные потоки подключаются к терминалу, чтобы пользователь мог вводить команды и видеть сообщения bash. Поэтому и программы "по умолчанию" запускаются с потоками, подключенными к терминалу. Но если при вызове bash перенаправить его стандартные потоки ввода/вывода, то именно перенаправленные потоки станут "значением по умолчанию" для всех выполняемых команд. Это позволяет перенаправлять ввод/вывод сразу всех команд сценария, если они используют стандартные потоки.

$ cat script.sh
echo 1
echo 2
$ bash script.sh
1
2
$ bash script.sh > out.txt
$ cat out.txt
1
2

Можно перенаправить потоки и при запуске bash в интерактивном режиме, но вы получите довольно чудное поведение, которое вряд ли может иметь смысл.

Попробовать что-то вроде bash > bash.out или bash -i 2> bash.err не запрещено, только не запутайтесь во вложенных сессиях. Если приглашение командной строки не поменялось, то это не значит, что вы общаетесь все с тем же процессом bash. Про опцию -i можно почитать в man bash.

2025/1/hints5 (последним исправлял пользователь is_rusinov 2025-10-07 13:46:58)