Учебная страница курса биоинформатики,
год поступления 2024
Ответы к упражнениям
Здесь можно подсмотреть, как правильно выполнять упражнения по мнению преподавателей (по крайней мере некоторых ). Даже если справились со всем самостоятельно, не помешает сверить ваши решения с предложенными.
#1
$ mkdir ~/term1/pr5
$ cd ~/term1/pr5
#2
$ less ~/term1/genome/*_feature_table.txt
#3
-- -N показать номера строк
-- -S не переносить длинные строки (можно использовать стрелочки влево/вправо для перемещения)
-- -U заменить некоторые символы (Tab, CR, Backspace, ...) на обозначения, чтобы их стало видно (соотв. ^I, ^M, ^H, ...).
#4
$ cut -f 1 ~/term1/genome/*_feature_table.txt > col1.txt
$ cut -f '1,2' ~/term1/genome/*_feature_table.txt > cols.txt
#5
$ wc -l ~/term1/genome/*_feature_table.txt
$ wc -l col*.txt
#6
$ sort cols.txt | uniq
или
$ sort -u cols.txt # этот вариант лучше
#7
$ sort -u cols.txt | less
#8
$ uniq -c col1.txt # делает не то, что вы ожидаете; читайте man uniq!
$ sort col1.txt | uniq -c # работает правильно
#9
$ sort cols.txt | uniq -c
#10
$ sort col1.txt | uniq -c | sort -n | less
#11
$ head -n 5 ~/term1/genome/*_feature_table.txt > rows.tsv
#12
$ tail -n '+2' ~/term1/genome/*_feature_table.txt | less
-- у tail -n означает "вывести, начиная со строки с номером", если аргумент опции начинается с +
-- то есть выводим со строки №2, пропуская первую
#13
$ head -n 1 ~/term1/genome/*_feature_table.txt | tr '\t' '\n' | less
-- вырезаем первую строку, заменяем в ней все символы табуляции на символы переноса строки
-- полный список обозначений, которые понимает tr, есть в man tr
#14
$ cut -f 1 ~/term1/genome/*_feature_table.txt | sort -u
-- узнаем, какие вообще значения встречаются в колонке
-- замечаем, что есть несколько типов РНК, причем всегда написано RNA заглавными буквами, а тип РНК указан строчными буквами
$ cut -f 1 ~/term1/genome/*_feature_table.txt | tr -d '[:lower:]' | sort | uniq -c
-- удаляем все строчные буквы из значений, чтобы все RNA посчитались вместе (не самим же числа складывать)
#15
$ cut -f '8-10' ~/term1/genome/*_feature_table.txt | tr '+-' '10' | less
#16
$ tail -n '+2' ~/term1/genome/*_feature_table.txt | cut -f '8,9' | tr '\t' '\n' | sort -u | wc -l
Подсказки по программам
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.