Kodomo

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

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

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

grep

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

tr

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

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

Если хотите выполнить второе задание на дополнительный балл (т.е. отформатировать выдачу), обратите внимание на опцию tr, позволяющую схлопывать (squeeze) повторяющиеся символы после замены (или даже вместо неё).

uniq

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

sort

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

cut

У cut есть опция -d, позволяющая задать свой символ-разделитель полей. Иногда это очень помогает вырезать нужную часть из каждой строки.

kodomo:~$ echo 1 2 3 4 5 > tmp.txt
kodomo:~$ echo a b c d e >> tmp.txt
kodomo:~$ echo 1 2 3 >> tmp.txt
kodomo:~$ echo QW ER TY UI OP >> tmp.txt
kodomo:~$ cut -f '2,4' -d ' ' tmp.txt
2 4
b d
2
ER UI
kodomo:~$ rm tmp.txt

bash

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

kodomo:~$ bash ~/term1/credits/pr5.sh

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

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

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

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

2026/1/hints5 (последним исправлял пользователь is_rusinov 2026-10-01 19:40:59)