管道符号 |
帮助命令 --help
1 awk
1.1 筛选某几列变量输出
awk '{if(NR>1){FS="\t"; OFS="\t"; print "chr"$1, $2, $2}}' SumGWAS.tsv > SumGWAS_hg38.bed
NR>1
跳过第一行,逻辑判断等于==
,或不等于!=
OFS="\t"
定义输出文件分割符,否则为默认空格
>
经常用,覆盖输出
$1
第几列变量,与字符串放一起直接在其前方添加
$2, $2
注意要有逗号,输出后为各自一列
1.2 变量简单处理成新格式
chr_pos_refAllele_othAllele (cut拆分chr1:12345)
awk '{if(NR<4) print NR"\t"$1"\t"$2"\t"$3+1"\t"$1"_"$2"_"$3"_"$4}' file
awk '{if(NR>1){OFS="\t"; print "chr"$1, $2, $2+1, NR}}' file
awk -F "\t" '{if(NR>=1){OFS="\t"; print $1,$2,$3,$4,$5,$6,$7,$8,$1":"$2}}' file > SummaryStat.tsv
1.3变量预览最小值
awk 'BEGIN {min = 2} {if(NR>=2){if ($10+0 < min+0) min=$10}} END {print "Min=", min}' GWAS_info.tsv
1.n 题外--liftOver转换坐标参考基因组
liftOver `SumGWAS_hg38.bed` /opt/tools/seq-analysis/liftover/hg38ToHg19.over.chain `SumGWAS_GRCh37.bed` unMapped
liftOver `hg19.bed` /opt/tools/seq-analysis/liftover/hg19ToHg38.over.chain `GRCh38.bed` unMapped
注意去掉上面单引号``
当时是为了做liftOver,顺便记录在这里,此处有个坑
awk '{print $1"\t"$2"\t"$3+1}' old.bed > new.bed
解决方案搬运自https://www.jianshu.com/p/34d2c65d7b3f
2.1 grep查找
2.1grep 与 awk 匹配查找pattern
awk '{if($1=="chr2") print $0}' hg38.bed |head
awk '{if($1=="2") print NR,$0}' file |head
2.2 grep正则表达式
^chr
行头
678$
行尾
grep -n -C 1 'chrX:' file
显示行号,上下各一行
grep -w
精确匹配
grep -v
反选
2.3 grep查找多个并输出
grep -E 'MarkerName|5:146629145:A_G|20:52727953:A_C' GWAS.tsv > Selected.tsv
2.4 grep查找文件
grep -f
3 sed
据说sed可顶所有, 参考linux命令行文本操作一文就够
3.1原文件上替换,添加Header,删除行
sed -i 's/X/23/g' Temp
sed -i '1i chr\tstart\tend\tNR' Temp
sed -i '1d' Temp
3.2更改第一行某变量名,重新输出
cat M.tsv| sed '1 s/SNP/variant/g' > Temp
3.3 显示指定行号内容,显示分隔符
sed -n '5,10p' Temp.file
sed -n l Temp.file | head
4 其他
wc -l file1 file2
计数行数
4.1 sort 排序
awk -F "\t" '{if($7<=5e-8){print NR "\t" $0}}' FILE.tsv | sort -t $'\t' -k8 -g |head
sort -k8,8 -g MetaResultWithHeader.tsv
sort -k1,1n -k2,2n test > ChrX_1_10_11_20.result
sort -k3,3V按染色体chr1:22X排序
科学计数法的问题,-g
搬运工关于-k的讲解
4.2 join 拼接(类似于R merge)
需先确认是否排序
sort -c -k4,4n Temp
echo $?
join -1 4 -2 4 -a 1 GRCh38.bed hg37.bed > TempJoin
保留文件1全部记录-a 1
,
指定行头 join --header
指定分隔符(输入+输出) join -t $'\t'
4.3 cut拆分(类似于strsplit)
awk '{print $1}' v2.tsv | cut -c 4-20 | awk '{FS=":";OFS="\t"}{if(NR>=2) {print $1,$2}}' > temp.tsv
sed -i "1i CHR\tGRCH38 " temp.tsv
4.4 paste合并不同文件(记录每行一一对应)
paste -d "\t" file1 file2
4. 跳过指定行数开始显示
wc -l file
cat -n file | tail -n + 1000 | head -n 2
有空不妨多去看看:
linux命令行文本操作一文就够
by: 熊+jimmy+SX 生信技能树 2017-12-14
(未完)