linux查漏补缺 1

2019-04-02  本文已影响0人  七白七白七七白

df -h :查看硬盘有多大,有多少可用空间

image.png

cat是一个命令,主要用来查看文件;在这与 *<<END *连用用于读入大段数据。输入 cat <<END 之后,回车,会看到
终端出现一个大于号,大于号后面可以输入内容,再回车,继续输入内容,直到我们输入 END (大写的,与上面一致),
输入过程结束,我们输入的内容都显示在了屏幕上。

ct@ehbio:~$ cat <<END
a
bc
END
a
bc

rename: 文件重命名 (常用于批量重命名,不同的系统可能用法略有不同,使用前先 man rename 查看使用方法)
rename 'test' 'ehbio' test*.fa

ln (link): 创建软连接 (ln -s source_file target)。
在建立软连接时,原文件要使用全路径。全路径指以/开头的路径。如果希望软链可以让不同的用户访问,不要使用 ~。
建立软连接,是为了在不增加硬盘存储的情况下,简化文件访问方式的一个办法。把其它文件夹下的文件链接到当前目
录,使用时只需要写文件的名字就可以了,不需要再写长串的目录了。

# 通常为了简化写法,使用 `pwd`代替全路径
# `为键盘 Esc 下面的按键,写在反引号内的命令会被运行,运行结果会放置在反引号所在的位置
ct@ehbio:~/ehbio_project$ ln -s `pwd`/ehbio2.fa ../data

gzip: 压缩文件; gunzip: 解压缩文件
gzip -c ehbio.fa >ehbio.fa.gz

wc -l 获取文件的行数

#获取文件中包含大于号 (>) 的行
grep '>' ehbio.fa
# 获取包含> 的行的行数 (-c: count lines)
grep -c '>' ehbio.fa 
# -v: 不输出匹配上的行
grep -v 'end' ehbio.fa >ehbio6.fa

| 为管道符,在相邻命令之间传递数据流,表示把上一个命令的输出作为下一个命令的输入。

sed 是一个功能强大的文件内容编辑工具,常用于替换、取得行号等操作。

ct@ehbio:~/ehbio_project$ cat ehbio6.fa
>mYC HAHA
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' ehbio.fa 
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

另外一个方式,去除 HAHA,使用 cut 命令。cut 更适合于矩阵操作,去除其中的一列或者多列。
-f: 指定取出哪一列,使用方法为-f 2 (取出第 2 列),-f 2-5 (取出第 2-5 列),-f 2,5 (取出第 2 和第 5 列)。
-d: 设定分隔符, 默认为 TAB 键。如果某一行没有指定的分隔符,整行都为第一列。

ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa 
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

! 加之前输入过的命令的前几个字母(无空格),快速获取前面的命令
!! 表示上一条命令。
替换上一个命令中的字符,再运行一遍命令,用于需要对多个文件执行同样的命令,又不想写循环的情况

# 输入一个命令
ct@ehbio:~/ehbio_project$ #cut -f 1 -d ' ' ehbio.fa | tail -n 4
# !! 表示上一条命令
# :gs 表示替换,把上一个命令中全部的 ehbio 替换为 ehbio3; g: global; s: substitute
ct@ehbio:~/ehbio_project$ !!:gs/ehbio/ehbio3

表示重定向标准输出,> filename 就是把标准输出存储到文件 filename 里面。标准错误还是会显示在屏幕上。
2 >&1 表示把标准错误重定向到标准输出。Linux 终端用 2 表示标准错误,1 表示标准输出。

tr: 是用于替换字符的,把空格替换为换行,文字就从一行变为了一列

ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n'
1
2
3

diff 是比较 2 个文件的差异的,需要 2 个参数
**- **(短横线) 表示上一个命令的输出,传递给 diff
**< **表示其后的命令的输出,也重定向给 diff

ct@ehbio:~$ cat <<END | diff - <(echo "1 2 3" | tr ' ' '\n')
> 2
> 3
> 4
> END
0a1
> 1
3d3
< 4

# 如果不使用管道和重定向标准输入,程序是这么写的
# 先把第一部分存储为 1 个文件
ct@ehbio:~$ cat <<END >firstfile
>2
>3
> 4
> END
ct@ehbio:~$ less firstfile
# 再把第二部分存储为 1 个文件
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n' >secondfile
# 然后比较
ct@ehbio:~$ diff firstfile secondfile
0a1
> 1
3d3
< 4

sed =:先输出行号,再输出每行的内容

ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed =
1
a
2
b
3
c

N: 表示读入下一行;sed 命令每次只读一行,加上 N 之后就是缓存了第 2 行,所有的操作都针对第一行;
s: 替换;把换行符替换为\t

ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed = | sed 'N;s/\n/\t/'
1 a
2 b
3 c

#把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
ct@ehbio:~$ echo "a b c" | tr ' ' '\n' | sed = | sed 'N;s/^/>/'
>1
a
>2
b
>3
c

# 把多条序列转成 FATSA 格式
# sed = 同时输出行号
# N: 表示读入下一行;sed 命令每次只读一行,加上 N 之后就是缓存了第 2 行,所有的操作都针对第一行;
# s: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
# 于是 FASTA 格式序列就出来了
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' '\n' | sed = | sed 'N;s/^/>/'
>1
actg
>2
aaaaa
>3
cccccg

seq 1 10# 产生从 1 到 10 的数,步长为 1
seq -s ' ' 1 10# 产生从 1 到 10 的数,步长为 1,用空格分割 #最后一个始终为最大值

sort: 排序,默认按字符编码排序。如果想按数字大小排序,需添加-n 参数。
sort 常用参数
-n: 数值排序
-h: 人类刻度的数值排序 (2K 1G 等)
-r: reverse, 逆序
-c: check, 不排序,查看文件是否已排序好
-k: 指定使用哪列或哪几列排序
-m: 合并已经排序好的文件
-S: 缓冲区大小,用于排序大文件时的分割排序中每次分割的文件大小
-u: 重复行只保留一次

# 系统默认按 ASCII 码排序,首先排 0,然后排 1, 3, 6, 9
ct@ehbio:~$ sort test
0
12
15
15
3
3
6
9
9
# 按数值大小排序
ct@ehbio:~$ sort -n test
0
3
3
6
9
9
12
15
15

sort -u: 去除重复的行,等同于 sort | uniq。

ct@ehbio:~$ sort -nu test
0
3
6
9
12
15

sort file | uniq -d: 获得重复的行。

ct@ehbio:~$ sort -n test | uniq -d
3
9
15

sort file | uniq -c: 获得每行重复的次数。

# 第一列为每行出现的次数,第二列为原始的行
ct@ehbio:~$ sort -n test | uniq -c
1 0
2 3
1 6
2 9
1 12
2 15
# 换一个文件看的更清楚
ct@ehbio:~$ cat <<END >test2
a
b
c
b
a
e
d
a
END
# 第一列为每行出现的次数,第二列为原始的行
ct@ehbio:~$ sort test2 | uniq -c
3 a
2 b
1 c
1 d
1 e

awk 是一个强大的文本处理工具,其处理数据模式为按行处理。每次读入一行,进行操作。
• OFS: 输出文件的列分隔符 (output file column separtor);
• FS 为输入文件的列分隔符 (默认为空白字符);
• BEGIN 表示在文件读取前先设置基本参数;与之相对应的是 END,只文件读取完成之后进行操作;
• 不以 BEGIN, END 开头的 {} 就是文件读取、处理的部分。每次对一行进行处理。

ct@ehbio:~$ sort test2 | uniq -c | awk 'BEGIN{OFS="\t";}{print $2, $1}'
a 3
b 2
c 1
d 1
e 1

# 按第二列数值大小排序
ct@ehbio:~$ sort test2 | uniq -c | awk 'BEGIN{OFS="\t";}{print $2, $1}' | sort -k2, 2n
c 1
d 1
e 1
b 2
a 3

# 第二列相同的再按第一列的字母顺序的逆序排序 (-r)
ct@ehbio:~$ sort test2 | uniq -c | awk 'BEGIN{OFS="\t";}{print $2,$1}' | sort -k2,2n -k1,1r
36
e 1
d 1
c 1
b 2
a 3

提取FASTA序列

ct@ehbio:~$ cat test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
>POU5F1
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
>NANOG
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT

# grep 匹配含有 SOX2 的行
# -A 1 表示输出的行中,包含匹配行的下一行 (A: after)
ct@ehbio:~$ grep -A 1 'SOX2' test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC

# 也可以使用 AWK
# 先判断当前行是不是 > 开头,如果是,表示是序列名字行,替换掉大于号,取出名字。
# sub 替换, sub(被替换的部分,要替换成的,待替换字符串)
# 如果不以大于号开头,则为序列行,存储起来。
# seq[name]: 相当于建一个字典,name 为 key,序列为值。然后就可以使用 name 调取序列。
# 若命令太长,可在末尾加一个 \, 换行书写
# awk 中$0 ~ />/ 里面的 ~ 不表示家目录,而是一个运算符,用来做模式匹配的
# /pattern/ 则表示与什么模式进行匹配,pattern 代表的是匹配模式
# awk 对文件是按行操作的,{} 里面的语句会对文件的每一行都进行判断或操作,循环执行
# $0: 表示当前行所有内容;$1, $2, $3 表示当前行第 1,2,3 列
# 关于引号,如果最外层用的是单引号,那么里面最好不要再出现单引号
# 如果最外面用的是双引号,则里面最好不要再出现双引号
# 命令会寻找最近的同样引号进行匹配。
ct@ehbio:~$ awk 'BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} \
else seq[name]=$0;}END{print ">SOX2"; print seq["SOX2"]}' test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC

多行 FASTA 序列提取要麻烦些,一个办法就是转成单行序列,用上面的方式处理。

ct@ehbio:~$ cat <<END >test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGG
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGACTGT
END

ct@ehbio:~$ cat test.fasta | tr '\n' '\t' | sed 's/\t>/\n>/g' \
| sed 's/\t/\n/' | sed 's/\t//g' >test.oneline.fa
# 第一步所有行变为一行
# 这一步使用 tr 是因为 tr 里面可以直接识别换行符,而 sed 不可以
# 其它的替换都使用 sed
# >号前面加换行符
# 先把第一 个TAB键变为换行符,实现序列名字和序列的分离
# 再去掉序列中所有的TAB键

或者
ct@ehbio:~$ awk 'BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} \
else seq[name]=seq[name]$0;}END{print ">SOX2"; print seq["SOX2"]}' test.fasta
# 对于单行 fasta 文件,只需要记录一行,seq[name]=$0
# 对于多好 fasta 文件,需要把每一行序列都加到前面的序列上,seq[name]=seq[name]$0

如果一个命令需要运行比较久,一般使用 nohup cmmand & 来放入后台不中断运行,这样退出终端也不影响程序。
**command & **是把程序放入后台。
jobs: 查看后台进程
bg: 显示后台进程, 即用 Ctrl+z 挂起或 ‘命令 &’ 执行的进程
fg job_id: 将后台进程转到前台执行
kill –9 process_id: 强制杀掉某个进程

文章来源:生信宝典

上一篇下一篇

猜你喜欢

热点阅读