> For the complete documentation index, see [llms.txt](https://huxi.gitbook.io/bioinformatic-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://huxi.gitbook.io/bioinformatic-notes/linux.md).

# Linux

## Pipeline

![](/files/-LKzzkp2NcEfOjdiUu4m)

## Data Structure

`GFF全称为general feature format，这种格式主要是用来注释基因组。`

`GTF全称为gene transfer format，主要是用来对基因进行注释。`

&#x20;       目前两种文件可以方便的相互转化，比如:使用Cufflinks软件的 的gffread。GTF文件由9列数据组成，这两种文件的前8列都是相同的（一些小的差别），gtf文件是以tab键分割的9列组成，以下为每一列的对应信息：

![GTF/GFF文件注释信息](/files/-LKWOsJIwbvlcwphxylu)

**1.2.1** 先创建一个自己的文件夹

```
mkdir my_folder
```

**1.2.2** 下载

1） 下载方法1： 可以从terminal下载：

```
wget http://www.ncrnalab.org/lulab/public/1.gtf.gz
```

2） 下载方法2： yeast基因组注释文件可以从浏览器下载：

[Download Link 1](https://github.com/lulab/training_book/blob/master/.gitbook/files/Saccharomyces_cerevisiae.R64-1-1.77.gtf.gz)

[Download Link 2](https://www.jianguoyun.com/p/DTCJc-gQ0NLuBRj9kQ4#dir=%2F2016%2F%E7%94%9F%E7%89%A9%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%AF%BC%E8%AE%BA%2F%E4%B8%8A%E6%9C%BA%E6%96%87%E4%BB%B6%2F3.Genomics%2FYeast%20Genome%20Annotation::mode=0)

**1.2.3** 解压缩

首先将\*.gtf.gz放到自己创建的目录下（可以使用cp或者mv命令）， 然后解压缩该文件：

```
gunzip *.gtf.gz
```

### Inputs\&#Outputs-Notes

本节内容主要Inputs是以下的Linux命令工具，本教程提供的example文件是`1.gtf`，按照前文指导，在docker 目录`/home/cs/Bioinfo_Lab/0.Linux`创建自己的文件夹，并下载example文件`1.gtf`。（通过example练习，理解并掌握以下这些命令，特别是`awk`，`cat`，`cut`，`grep`，`wc`的用法其参数的用法是本章学习的重点和难点，也是主要的homework之一。）

```
cd 
awk
less
ls
cat
cut
grep
wc
mkdir
wget
gunzip
cp
```

## Running Scripts

本章内容主要是学会用Linux的一些简单编程方法去查看GTF/GFF基因组注释文件的基本信息，并学会对文件中数据进行提取，利用提取到的数据计算特定feature（例如计算基因积累长度等）。顺利掌握以下操作的前提是，必须熟悉GTF/GFF文件的注释信息，特别是要每一列对应的内容是什么。进行以下操作前，先启动Docker，进入上一章创建的bioinfo容器，并且下载并解压缩本教程配套1.gtf文件（本教程提供的是yeast基因组注释文件）。当做好这些准备工作，开始以下操作（Tips/Utilitie部分对Linux命令行格式及一些参数符号进行简单注释，可供参考）。

> 注意：如果挂载主机目录，请注意切换工作目录。

### step1.查看文件基本信息

尝试输入以下命令，分别查看`1.gtf`文件的开头、结尾、文件的大小、行数等基本信息。

```
less -S 1.gtf | head  #显示1.gtf文件前10行
less -S 1.gtf | tail  #显示1.gtf文件后10行
less -S 1.gtf | head -n  #显示1.gtf文件前n行(输入时n用整数取代)

ls -lh 1.gtf  #显示1.gtf文件的大小
wc -l 1.gtf  #统计1.gtf文件行数
grep -v "#" 1.gtf | grep -v '^$' | wc -l #排除commend line(以#开头的部分)以及无意义的空白行，所以你需要用grep -v排除那些无意义的行

awk '{if($0!=" ") print}' 1.gtf #过滤空行
grep -v ^# 1.gtf |head -5 #过滤开头注释行commend line(以#开头的部分)并显示前5行

```

### step2.数据提取

首次尝试，先复制以下命令，分别提取`1.gtf`文件的特定列、行等数据信息；观察输出结果，然后建议尝试修改以下命令中的参数，进行更多的练习。

#### 2.1 筛选特定的列

```
#选取1-3列的数据（以下两种命令都可以）
cat 1.gtf | awk ' { print $1, $2, $3 } ' | head
cat 1.gtf | cut -f 1,2,3 | head

Eg.例如我只需要GTF文件的第1,3，4,5行也就是chr,feature,start,end。
cut -f 1,3,4,5 1.gtf | head
```

#### 2.2 筛选特定的行

```
# 假设我们想要提取第三列是gene的行,并且只显示第1，3，9这几列信息。
cat 1.gtf | awk '$3 =="gene" { print $3, $5-$4 + 1 } ' |head
```

### Step3.提取和计算特定的feature

这一阶段是在学会step2的基础上，进一步的学习。首次尝试，先复制以下命令，观察输出结果，然后建议尝试修改以下命令中的参数，进行更多的练习。

#### 3.1 提取并统计featrue类型

```
grep -v ^# 1.gtf |awk '{print $3}'| sort | uniq -c  #提取并计数有多少类feature
```

#### 3.2 计算特定feature特征长度

```
#*第5列的数值减去第4列的数值后+1，即得到特征feature的长度
cat 1.gtf | awk ' { print $3, $5-$4 + 1 } ' | head 

# 计算所有gene的累积长度
cat 1.gtf | awk '$3 =="gene" { len=$5-$4 + 1; size += len; print "Size:", size } ' |head

#计算所有CDS的累积长度
cat 1.gtf | awk '$3 =="CDS" { len=$5-$4 + 1; size += len; print "Size:", size } ' |tail

#计算1号染色体cds的平均长度
awk 'BEGIN  {s = 0;line = 0 } ;$3 =="CDS" && $1 =="I" { s += ($5 - $4);line += 1}; END {print "mean=" s/line}' 1.gtf

```

#### 3.3 分离并提取基因名字

```
#从gtf文件中分离提取基因名字
cat 1.gtf |awk '$3 == "gene"{split($10,x,";");name = x[1];gsub("\"", "", name);print name,$5-$4+1}'|head 

```

### step4.提取数据并存入新文件

这一阶段主要是学会提取数据并存入新文件，例如，**寻找长度最长的3个exon, 汇报其长度**。

这里介绍两种方法。

第一种是直接提取并计算最长3个exon, 汇报其长度，存入`txt`文件；

第二种方法是写一个可执行文件`run.sh`，寻找长度最长的3个exon，汇报其长度。

#### 4.1 提取数据存入txt文件示范

输入命令如下，则可将结果存入新文件`1.txt`，这里提取并存入的命令是`>`。

```
grep exon 1.gtf | awk '{print $5-$4+1}' | sort -n | tail -3 > 1.txt
```

然后输入命令`less -S 1.txt` 或者`vi 1.txt` 则可进入vi一般模式界面显示输出结果，例如：

![](/files/-LL8Y6NaWH2GFwNoS-oR)

> vi简单使用教程详见Tips，此时,在英文输入法状态下按`:q`或`:wq`可以退回到终端sell窗口。
>
> 如果docker挂载了主机目录，则可访问主机目录查看1.txt文件。

#### 4.2 可执行文件编辑示范

第一步，输入命令`vi run.sh`，进入vi编辑界面。

第二步，按`i`键切换至insert模式后，写下rush.sh的文件内容如下：

```
#!/bin/bash   
grep exon *.gtf | awk '{print $5-$4+1}' | sort -n | tail -3
```

（第一行语句一般用来声明这个脚本使用的shell名称，“#”后的语句可作为批注，在执行时会被忽略）

第三步，按`esc`或`ctrl+[`切回普通模式，输入`:wq`退出vi编辑器，在命令行后键入：

```
chmod +x run.sh
./run.sh
```

输出如下所示，与1.txt的内容一致。

![](/files/-LL8aOsG0JBGmY-UolcZ)

## Tips/Utilitie

\
1\. Linux命令行格式通常写法如下：

命令 *（空格）*&#x9009;&#x9879;*（空格）*&#x53C2;数1 参数2...\
&#x20;   `mv -f folder1 folder2`

> 注意：命令、选项、参数之间一定要用**空格**来区分！

2\. 两种表达方式：短格式 vs 长格式。

&#x20;     `① 短格式的命令选项：用一个“-”和一个单个英文字母表示,如“-a”。`

&#x20;     `② 长格式的命令选项：用两个“-”和一个英文单词表示,如“--help”。`

&#x20;    即 ls -h  与 ls   --help  或者  ls -a  与  ls  --all 所起的作用都是相同的。

3.`cd`——进入工作目录

```
cd                  #cd后面为空时，进入默认家目录    
cd 工作目录名称      #TAB键可进行名称自动补全，推荐经常使用
```

一般的程序后面都要输入文件位置和名称，告知程序输入和输出是什么：

`./filename 指当前目录下的文件 ../filename 指上一级目录下的文件 ../../filename 指上两级目录下的文件.`<br>

4."`|`"是管道命令操作符，它可以将左边命令传出的正确输出信息（standard output）作为右边命令的标准输入（standard input）。

5.建议在对`*.gtf`文件执行的一些命令行Inputs末尾加上`| head -n` 或者 `| tail -n`，然后Outputs会自动显示文件前n行或者后n行；否则，屏幕会被刷屏。

6.星字符：`*` 可以代表任何字符，称之为wildcard。

7.vi文本编辑器使用，主要就是模式之间的切换，如下图所示。

![](/files/-LL8bJuh9ySnbl_1FPvZ)

## Homework and more

### homework

1. 阅读《鸟哥的Linux私房菜－基础学习篇》(第5-10章推荐章节)
2. 查找、理解并注释上述每一个语句和参数的意义&#x20;
3. 解释gtf/gff文件中第4、5列（$4,$5)代表什么，exon长度应该是$5-$4+1还是$5-$4？
4. 有新的方法加分，但必须注释清楚每个语句和参数的意义和结果。？？

### more

> 本章主要参考以下几篇生信数据文章：
>
> <https://www.jianshu.com/p/48b5a0972301>
>
> <https://blog.csdn.net/sinat_38163598/article/details/72851239>
>
> <https://zhuanlan.zhihu.com/p/36065699>
>
> <https://gist.github.com/sp00nman/10372555>
>
> <https://www.jianshu.com/p/7af624409dcd>
