linux视频 文本处理 笔记

听老大哔哩哔哩视频中的linux文本处理的部分,其中讲到三驾马车(grep、awk、sed)部分很快就迷糊了,工欲善其事,必先利其器。这几种文本操作的主要命令需要有大致了解,视频才能做到至少跟得上。主要根据视频中老大提过的linux命令行文本操作一文就够来进行总结学习,理解其中的举例。下步再去看作业题。

Cut

-f选项指定列,可以是一个范围(比如2-8),注意不能用它给列排序。

1.wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3
gene
transcript
exon
exon
exon
transcript
exon
exon
exon
transcript
2.wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3-5
gene    11869   14412
transcript    11869   14409
exon    11869   12227
exon    12613   12721
exon    13221   14409
transcript    11872   14412
exon    11872   12227
exon    12613   12721
exon    13225   14412
transcript    11874   14409
3.wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 10 | cut -f 3-5 | column -t #使用column来格式化输出
gene 11869 14412
transcript 11869 14409
exon 11869 12227
exon 12613 12721
exon 13221 14409
transcript 11872 14412
exon 11872 12227
exon 12613 12721
exon 13225 14412
transcript 11874 14409

grep

wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ head -n 6 Homo_sapiens.GRCh37.75.gtf
1.#!genome-build GRCh37.p13
2.#!genome-version GRCh37
3.#!genome-date 2009-02
4.#!genome-build-accession NCBI:GCA_000001405.14
5.#!genebuild-last-updated 2013-09
6.1    pseudogene  gene    11869   14412   .   +   .   gene_id "ENSG00000223972"; gene_name "DDX11L1"; gene_source "ensembl_havana"; gene_biotype "pseudogene";

-v:排除匹配到的

wsx@wsx-ubuntu:~/Work/research/Promoter_Research$ grep -v "^#" Homo_sapiens.GRCh37.75.gtf | head -n 1
1    pseudogene  gene    11869   14412   .   +   .   gene_id "ENSG00000223972"; gene_name "DDX11L1"; gene_source "ensembl_havana"; gene_biotype "pseudogene";

sort

默认情况下, sort用空格或tab键作为域(列)分隔符。如果我们用其他形式的分隔符,需要用 -t选项指定

wsx@wsx-ubuntu:~$ cat test.bed
chr1    26  39
chr3    32  47
chr1    40  50
chr1    9   28
chr2    35  54
chr1    10  19
wsx@wsx-ubuntu:~$ sort test.bed #文本按照第一列排序
chr1    10  19
chr1    26  39
chr1    40  50
chr1    9   28
chr2    35  54
chr3    32  47

-k指定某列的排序方式

#sort用-k选项指定某列的排序方式,-k1,1 就是第1列起始,第1列中止,即指第1列
wsx@wsx-ubuntu:~$ sort -k1,1 -k2,2n test.bed#n是把第2列当作数值,如果不做设定,shell都是当做字符对待
chr1    9   28
chr1    10  19
chr1    26  39
chr1    40  50
chr2    35  54
chr3    32  47

-r:反向排序

wsx@wsx-ubuntu:~$ sort -k1,1 -k2,2nr test.bed 
chr1    40  50
chr1    26  39
chr1    10  19
chr1    9   28
chr2    35  54
chr3    32  47

-v:按照数字顺序大小排序

wsx@wsx-ubuntu:~$ sort -k1,1 -k2,2n test.bed
chr1    9   28
chr1    10  19
chr1    26  39
chr1    40  50
chr11    22  56
chr2    35  54
chr3    32  47
wsx@wsx-ubuntu:~$ sort -k1,1V -k2,2n test.bed #加了-v后,使新增的chr11排在最后
chr1    9   28
chr1    10  19
chr1    26  39
chr1    40  50
chr2    35  54
chr3    32  47
chr11    22  56

-c:检查一个文件是不是已经按照过某种方式排过序了

用 -c选项检查一个文件是不是已经按照过某种方式排过序了
wsx@wsx-ubuntu:~$ sort -k1,1 -k2,2n test.bed | sort -k1,1 -k2,2 -c
sort:-:2:无序: chr1    10  19
wsx@wsx-ubuntu:~$ echo $?
1
wsx@wsx-ubuntu:~$ sort -k1,1 -k2,2n test.bed | sort -k1,1 -k2,2n -c
wsx@wsx-ubuntu:~$ echo $?
0 #一般shell返回0表示成功执行

uniq

#创建样例文本
wsx@wsx-ubuntu:~$ cat test.letter
A
A
B
C
B
C
C
C
D
F
D
wsx@wsx-ubuntu:~$ uniq test.letter #只去掉连续的同一字符
A
B
C
B
C
D
F
D
wsx@wsx-ubuntu:~$ sort test.letter | uniq # sort不是刚好可以把同样的字符弄到一起去吗,然后再使用 uniq
A
B
C
D
F

-c:计数

wsx@wsx-ubuntu:~$ sort test.letter | uniq -c
2 A
2 B
4 C
2 D
1 F
#结果在排序
wsx@wsx-ubuntu:~$ sort test.letter | uniq -c | sort -rn#r:反向排序 ,n:
4 C
2 D
2 B
2 A
1 F

-d:选项只输出重复行

wsx@wsx-ubuntu:~$ cat test.letter
A
A
B
C
B
C
C
C
D
F
D
wsx@wsx-ubuntu:~$ uniq -d test.letter
A
C
wsx@wsx-ubuntu:~$ sort test.letter | uniq -d
A
B
C
D

join

语法:join -1 -2

-1-2选项后接参数分别指定了这个支点,也就是连接的域(列)

#wsx@wsx-ubuntu:/tmp$ cat example.bed
chr1    26  39
chr1    32  47
chr3    11  28
chr1    40  49
chr3    16  27
chr1    9   28
chr2    35  53
wsx@wsx-ubuntu:/tmp$ cat example_length.txt
chr1    53453
chr2    34356
chr3    24356

把第二个文件说明染色体长度添加到第一个文件对应染色体的第三列。 我们首先要给文件排序(使用 join前必须做),然后使用 join命令。

wsx@wsx-ubuntu:/tmp$ sort -k1,1 example.bed > example_sorted.bed
wsx@wsx-ubuntu:/tmp$ sort -c -k1,1 example_length.txt
wsx@wsx-ubuntu:/tmp$ cat example_sorted.bed
chr1    26  39
chr1    32  47
chr1    40  49
chr1    9   28
chr2    35  53
chr3    11  28
chr3    16  27
wsx@wsx-ubuntu:/tmp$ join -1 1 -2 1 example_sorted.bed example_length.txt > example_with_length.txt
wsx@wsx-ubuntu:/tmp$ cat example_with_length.txt
chr1 26 39 53453
chr1 32 47 53453
chr1 40 49 53453
chr1 9 28 53453
chr2 35 53 34356
chr3 11 28 24356
chr3 16 27 24356

awk

awk核心是它用$0表示所有列,$1表示第1列,$2表示第2列,以此类推。

# awk核心是它用$0表示所有列,$1表示第1列,$2表示第2列,以此类推。
wsx@wsx-ubuntu:/tmp$ awk '{print $0}' example.bed
chr1    26  39
chr1    32  47
chr3    11  28
chr1    40  49
chr3    16  27
chr1    9   28
chr2    35  53
wsx@wsx-ubuntu:/tmp$ awk '{print $1}' example.bed
chr1
chr1
chr3
chr1
chr3
chr1
chr2
wsx@wsx-ubuntu:/tmp$ awk '{print $2}' example.bed
26
32
11
40
16
9
#print语句
wsx@wsx-ubuntu:/tmp$ awk '{ print $2 "\t" $3}' example.bed
26    39
32    47
11    28
40    49
16    27
9    28
35    53
wsx@wsx-ubuntu:/tmp$ awk '{ print $2 $3}' example.bed
2639
3247
1128
4049
1627
928
3553
wsx@wsx-ubuntu:/tmp$ awk '{ print $2 , $3}' example.bed
26 39
32 47
11 28
40 49
16 27
9 28
35 53
#表示染色体名一般用带 chr或者不带 chr标志两种方式。当我们要用到这两种时,肯定要让它们能够对应起来,也就是转换。 awk命令可以非常方便地添加 chr标记。下面我先把例子文件的 chr去掉,然后加上试试
wsx@wsx-ubuntu:/tmp$ awk '{ print $1}' example.bed
chr1
chr1
chr3
chr1
chr3
chr1
chr2
wsx@wsx-ubuntu:/tmp$ awk '{ print $1}' example.bed | cut -c4
1
1
3
1
3
1
2
wsx@wsx-ubuntu:/tmp$ awk '{ print $1}' example.bed | cut -c4 | awk '{print "chr"$1}'
chr1
chr1
chr3
chr1
chr3
chr1
chr2

sed

参考http://man.linuxde.net/sed

\反斜杠

/正斜杆

参数巨多,老大说每个命令都是本书,后续碰到有价值的需要继续记录。

转载自:https://mp.weixin.qq.com/s/w1nGKH-_hv5YSmAcRQFIcA

​ http://man.linuxde.net/sed

你可能感兴趣的:(linux视频 文本处理 笔记)