生信单行脚本记录

awk & sed & perl 单行操作

  • 输出第五列等于,不等于abc123的行
    • 分隔符-F,
1
2
3
4
5
6
7
8
awk '$5 == "abc123"' file.txt
perl -alne 'print if $F[4]=="abc123"'

awk '$5 != "abc123"' file.txt
perl -alne 'print if $F[4]!="abc123"'

awk -F, '$5 =="abc123"' file.txt
perl -F, -alne 'print if $F[4]=="abc123"'
  • 输出第7列不是以字母a-f开头的行
1
2
awk '$7 !~ /^[a-f]/' file.txt
perl -alne 'print if $F[6] !~ /^[a-f]/'
  • 输出第2列的值比第5列大的行
1
2
awk '$3>$5' file.txt
perl -alne 'print if $F[2]>$F[4]'
  • 计算第一列的累加值,输出结果
    • 计算平均值
1
2
3
4
awk '{sum+=$1} END{print sum}' file.txt
perl -alne ' {$sum+=$F[0]}; END{print"$sum\n"} ' file.txt

awk '{sum+=$1} END{print x/NR}' file.txt
  • 消除开头或结尾的 空格或制表符,去除空行
1
2
sed 's/^[\s\t]*//; s/[\s\t]*$//' file.txt
sed '/^$//d' file.txt

find, xargs, sort, uniq 等

  • ls按照后缀名聚类显示ls -X

  • 查看csv/tsv文件表头有多少列(例如ncbi runinfo的表头信息):

1
cat runinfo.txt | head -1 | tr '\t' '\n' |wc -l
  • 从文件中随机取10行
1
shuf file.txt | head -n 10
  • 第二列出现最多的字符串
1
cut -f 2 file.txt | sort |uniq -c |sort -k1 -nr
  • 将所有.txt 文件修改为.bak(例如在对*.txt做操作之前用于文件备份)
1
find . -name "*.txt" |sed 's/\.txt$//' | xargs -i echo mv {}.txt {}.bak |sh
  • 输出一个特定的行(比如 42行
1
sed -n 42p file.txt
  • 通过parallel并行运行12个fastqc任务
1
find 0_raw_data | parallel -j 10 "fastqc {} --outdir ."
  • 直接定义一个extract函数,直接extract解压缩(修改.bashrc)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.tar.xz) tar Jxvf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know how to extract '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
  • 把上次执行的命令生成一个脚本
1
echo "!!" > foo.sh
  • 反向互补序列
1
echo 'ATTGCTATGCTNNNT' |rev |tr 'ACTG' 'TGAC'
  • 更工整的输出格式
1
2
cat file.txt | column -t |less -S
csvtk pretty ### install csvtk
  • 对samtools mpileup并行化call SNP
1
2
3
4
5
6
7
8
BAM="yourFile.bam"
REF="reference.fasta"
samtools view -H $BAM
| grep "\@SQ"
| sed 's/^.*SN://g'
| cut -f 1
| xargs -I {} -n 1 -P 24 sh -c "samtools mpileup -BQ0 -d 100000 -uf $REF -r \"{}\" $BAM
| bcftools call -cv > \"{}\".vcf"
  • 对多个tsv/csv表根据表头columns对行rows合并。类似于dplyr中的left_join()
1
2
3
4
5
## 合并col_names相同的表
csvtk concat names.csv names.reorder.csv |csvtk pretty

## 忽略大小写,保留空的行,以"NA"表示
csvtk concat names.csv names.with-unmatched-colname.csv -i -u NA | csvtk pretty

参考资料

文章目录
  1. 1. awk & sed & perl 单行操作
  2. 2. find, xargs, sort, uniq 等
    1. 2.1. 参考资料
|