听老大哔哩哔哩视频中的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 <file_1_field> -2 <file_2_field> <file_1> <file_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
\
反斜杠
/
正斜杆