美文网首页
linux查漏补缺 1

linux查漏补缺 1

作者: 七白七白七七白 | 来源:发表于2019-04-02 17:38 被阅读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 表示标准输出。

    • (短横线):表示标准输入,一般用于 1 个程序需要多个输入的时候。
      < 标准输入,后面可以跟可以产生输出的命令,一般用于 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: 强制杀掉某个进程

    文章来源:生信宝典

    相关文章

      网友评论

          本文标题:linux查漏补缺 1

          本文链接:https://www.haomeiwen.com/subject/xtxgbqtx.html