# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://huxi.gitbook.io/bioinformatic-notes/linux.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
