Linux学习 - 常用和不太常用的实用awk命令

Linux学习 - 常用和不太常用的实用awk命令

Linux学习系列文章是生信宝典最开始主推的一块,力图从一个新额视角帮助初学者快速入门Linux系统,熟悉Linux下的文件和目录,文件操作, 文件内容操作。而且教程摒弃了完美操作,列举出常见错误和解决方式,管道、标准输入输出解惑Linux下多种信息输出方式。

在文件排序和FASTA文件操作中简述了awk和sed的使用,作为一个引子。本篇则详细列举关于awk常用的操作和一些偏门的操作。

awk基本参数解释

awk擅长于对文件按行操作,每次读取一行,然后进行相应的操作。

awk读取单个文件时的基本语法格式是awk ‘BEGIN{OFS=FS=“\t”}{print $0, $1;}’ filename。

读取多个文件时的语法是awk ‘BEGIN{OFS=FS=“\t”}ARGIND1{print $0, $1;}ARGIND2{}’ file1 file2。

awk后面的命令部分是用引号括起来的,可以单引号,可以双引号,但注意不能与内部命令中用到的引号相同,否则会导致最相邻的引号视为一组,引发解释错误。

OFS: 文件输出时的列分隔符 (output field separtor)

FS: 文件输入时的列分隔符 (field separtor)

BEGIN: 设置初始参数,初始化变量

END: 读完文件后做最终的处理

其它{}:循环读取文件的每一行

$0表示一行内容;$1, $2, … $NF表示第一列,第二列到最后一列。

NF (number of fields)文件多少列;NR (number of rows) 文件读了多少行: FNR 当前文件读了多少行,常用于多文件操作时。

a[$1]=1: 索引操作,类似于python中的字典,在ID map,统计中有很多应用。

常见操作

针对特定列的计算,比如wig文件的标准化

ct@ehbio:~/sxbd$ cat ehbio.wig
variableStep chrom=chr2
300701    12.5
300702    12.5
300703    12.5
300704    12.5
300705    12.5
ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}{$2=$2*10^6/(2.5*10^6); print $0}' wig 
tep chrom=chr2    0
300701    4.4
300702    4.8
300703    4
300704    4.8
300705    4.8

计算某列内容出现的次数。

ct@ehbio:~/sxbd$ cat count 
ID    Type
Pou5f1    Pluripotency
Nanog    Pluripotency
Sox2    Neuron
Tet1    Epigenetic
Tet3    Epigenetic
Myc    Oncogene
ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}{if(FNR>1) a[$2]+=1;}END{print "Type\tCount"; for(i in a) print i,a[i];}' count
Type    Count
Neuron    1
Epigenetic    2
Oncogene    1
Pluripotency    2# 这个也可以用下面方式代替,但不直接
ct@ehbio:~/sxbd$ tail -n +2 count | cut -f 2 | sort | uniq -c | sed -e 's/^  *//' -e 's/  */\t/' 
2    Epigenetic
1    Neuron
1    Oncogene
2    Pluripotency

之前也提到过的列操作,从GTF文件中提取启动子区域

sed 's/"/\t/g' GRCh38.gtf | awk 'BEGIN{OFS=FS="\t"}{if($3=="gene") {ensn=$10; symbol=$16; if($7=="+") {start=$4-1; up=start-1000; if(up<0) up=0; dw=start+500; print $1,up, dw, ensn, symbol, $7;} else if($7=="-") {start=$5-1; up=start+1000; dw=start-500; if(dw<0) dw=0; print $1,dw,up,ensn,symbol,$7}}}' | sort -k1,1 -k2,2n >GRCh38.promoter.bed

数据矩阵的格式化输出

ct@ehbio:~/sxbd$ cat numertic.matrix 
ID    A    B    C
a    1.002    1.234    1.999
b    2.333    4.232    0.889
ct@ehbio:~/sxbd$ awk '{if(FNR==1) print $0; else {printf "%s%s",$1,FS; for (i=2; i<=NF; i++) printf "%.1f %s", $i, (i==NF?RS:FS)}}' numertic.matrix 
ID    A    B    C
a 1.0  1.2  2.0 
b 2.3  4.2  0.9

判断FASTQ文件中,输出质量值的长度是与序列长度不一致的序列ID

zcat Test_2.fq.gz | awk '{if(FNR%4==1) ID=$0; else if(FNR%4==2) seq_len=length($0); else if(FNR%4==0) {quality_len=length($0); if(seq_len!=quality_len) print ID; }}'

筛选差异基因

ct@ehbio:~/sxbd$ cat de_gene
ID    log2fc    padj
A    1    0.001
B    -1    0.001
C    1    0.001
D    2    0.0001
E    -0.51    0.051
F    0.1    0.1
G    1    0.1ct@ehbio:~/sxbd$ awk '$3<0.05 || NR==1' de_gene 
ID    log2fc    padj
A    1    0.001
B    -1    0.001
C    1    0.001
D    2    0.0001ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}{if(FNR==1) print $0; else {abs_log2fc=($2<0?$2*(-1):$2);if(abs_log2fc>=1 && $3<0.05) print $0;}}' de_gene 
ID    log2fc    padj
A    1    0.001
B    -1    0.001
C    1    0.001
D    2    0.0001

筛选差异基因存储到不同的文件

ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"; up="up"; dw="dw";}{if(FNR==1) {print $0 >up; print $0 >dw;} else if ($3<0.05) {if ($2>=1) print $0 >up; else if($2<=-1) print $0 >dw;}}' de_gene 
ct@ehbio:~/sxbd$ head up dw
==> up <==
ID    log2fc    padj
A    1    0.001
C    1    0.001
D    2    0.0001==> dw <==
ID    log2fc    padj
B    -1    0.001

ID map,常用于转换序列的ID、提取信息、合并信息等

ct@ehbio:~/sxbd$ cat id_map 
ENSM    Symbol    Entrez
ENSG00000280516    TMEM42    693149
ENSG00000281886    TGM4    7047
ENSG00000280873    DGKD    8527
ENSG00000281244    ADAMTS13    11093
ENSG00000280701    RP11-272D20.2    
ENSG00000280674    ZDHHC3    51304
ENSG00000281623    Y_RNA    
ENSG00000280479    CACFD1    11094
ENSG00000281165    SLC2A6    11182
ENSG00000281879    ABO    28
ENSG00000282873    BCL7A    605
ENSG00000280651    AC156455.1    100506691
ct@ehbio:~/sxbd$ vim ensm
ct@ehbio:~/sxbd$ cat ensm 
ENSG00000281244
ENSG00000281165
ENSG00000282873
ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}ARGIND==1{if(FNR>1) ensm2entrez[$1]=$3;}ARGIND==2{print ensm2entrez[$1];}' id_map ensm
11093
11182
605# 替代解决方案,注意 -w的使用,避免部分匹配。最稳妥的方式还是使用awk。ct@ehbio:~/sxbd$ grep -w -f ensm id_map | cut -f 3
11093
11182
605

转换大小写, toupper, tolower

ct@ehbio:~/sxbd$ cat symbol 
Tgm4
Dgkd
Aboct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}ARGIND==1{if(FNR>1) ensm2entrez[$2]=$3;}ARGIND==2{print ensm2entrez[toupper($1)];}' id_map symbol 
7047
8527
28

awk数值操作

# log2对数
awk 'BEGIN{OFS="\t";FS="\t"}{print log($0)/log(2)}' file# 取整,四舍五入
awk 'BEGIN{OFS="\t";FS="\t"}{print int($1+0.5);}' file

awk定义函数

awk 'function abs(x){return ((x < 0.0) ? -x : x)}BEGIN{OFS="\t";FS="\t"}{pos[1]=$1;pos[2]=$2;pos[3]=$3;pos[4]=$4; len=asort(pos);for(i=len;i>1;i--) print abs(pos[i]-pos[i-1]);}' file

字符串匹配

ct@ehbio:~/sxbd$ cat ens.bed
1    100    105
2    100    105
3    100    105
Mt    100    105
X    100    105
ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}{if($1~/^[0-9XY]/) $1="chr"$1; else if($1~/M.*/) gsub(/M.*/, "chrM", $1); print $0}' ens.bed 
chr1    100    105
chr2    100    105
chr3    100    105
chrM    100    105
chrX    100    105

字符串分割

ct@ehbio:~/sxbd$ cat trinity_id
Trinity_C1_g1_i1
Trinity_C1_g1_i2
Trinity_C1_g1_i3
Trinity_C2_g1_i1
Trinity_C3_g1_i1
Trinity_C3_g3_i2
ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}{count=split($1, geneL, "_"); gene=geneL[1]; for(i=2;i<count;i++) gene=gene"_"geneL[i]; print gene,$1;}' trinity_id 
Trinity_C1_g1    Trinity_C1_g1_i1
Trinity_C1_g1    Trinity_C1_g1_i2
Trinity_C1_g1    Trinity_C1_g1_i3
Trinity_C2_g1    Trinity_C2_g1_i1
Trinity_C3_g1    Trinity_C3_g1_i1
Trinity_C3_g3    Trinity_C3_g3_i2

awk脚本

cat <<END >grade.awk
f ( avg >= 90 ) grade="A";
else if ( avg >= 80) grade ="B";
else if (avg >= 70) grade ="C";
else grade="D";
ENDawk -f grade.awk grade

awk给每行增加行号,使其变为唯一

awk 'BEGIN{OFS="\t";FS="\t"}NR!=1{$4=$4"_"NR;print $0}' file

糅合操作

awk中执行系统命令 (注意引号的使用)

# 系统命令组成字符串,交给system函数运行
awk 'BEGIN{OFS=FS="\t"}{system("mv "$1".fq "$2".fq");}' input_mat

awk 引用系统变量

ct@ehbio:~/sxbd$ echo 1 | awk -v ehbio="shengxinbaodian" -v ehbio2="SXBD" '{print ehbio, ehbio2;}'
shengxinbaodian SXBD

学会了基本命令,生信分析中还有一大块是使用已经安装好的工具,针对软件安装中遇到的问题,推出了系列文章:环境变量和可执行属性彻底释义环境变量的概念;列举出Linux下软件安装的各种方法,并针对Docker和Conda分别发文介绍。

P13 Linux下awk命令学习和应用01

P14 Linux下awk命令学习和应用02

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

immutable variables, constants的区别(rust)

let immutable_variable 1590865; //不可变变量 const constant_variable 0096; //常量常量、不可变变量一样&#xff0c;都无法更改变量的值&#xff0c;但是常量和不可变变量之间存在以下区别&#xff1a; 不可变变量默认不可变&#xff0c;编译器会进行检查。常量不仅在默…

vs2022断点调试怎么看堆栈帧,找异常位置

打一个断点以后&#xff0c;会出现如图报错 我们要怎么找到报错的语句&#xff1f;鼠标点击->堆栈帧->上一行运行的位置->直到找到错误出错如图所示&#xff1a; 跳转到&#xff0c;我们手写的代码&#xff0c;执行出错的位置

意大利西班牙罗马尼亚葡萄牙网红达人:探索广告媒介公司的资源与合作机会

【本篇由言同数字科技有限公司原创】在当今数字化时代&#xff0c;品牌营销已经不再局限于传统媒体&#xff0c;而是转向了社交媒体平台&#xff0c;其中包括北美地区的TikTok和YouTube。这两个平台为品牌提供了直播带货的绝佳机会&#xff0c;而北美网红则成为了品牌推广和产品…

Unity | Shader基础知识(第十二集:颜色混合)

目录 前言 一、日常生活中的常见现象 二、unity自带的一个结构体&#xff08;表面着色器SurfaceOutputStandard&#xff09; 三、自己写一个颜色混合的Shader 1.只加基础颜色Albedo 2.加入法线 3.加入光滑度 4.加入金属度 5.加入自发光 四、作者的话 前言 shader里每一…

docker安装nessus服务及使用

Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件&#xff0c;现在软件服务越来越多&#xff0c;越来越复杂&#xff0c;涉及的数据也更多&#xff1b;因此系统完成后对于系统漏洞的检测并对其进行修改十分有必要&#xff0c;本文介绍通过docker安装nessus服务及简单的使…

设计模式-模板方法模式(TemplateMethod)

1. 概念 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义算法的骨架&#xff0c;将一些步骤延迟到子类中实现。 2. 原理结构图 2.1 图 2.2 角色 抽象类&#xff08;Abstract Class&#xff09; 定义抽象的基本操作&#xff08;Primitive Operations&#xff…

从启发式到模型化 京东推荐广告排序机制演化

1、序言&#xff1a;广告排序机制的前世今生 1.1、简介&#xff1a;广告排序机制 在线广告是国内外各大互联网公司的重要收入来源之一&#xff0c;而在线广告与传统广告最大的区别就在于其超大规模的实时竞价环境&#xff1a;数以万计的广告主在一天内可以参与亿级别的流量竞…

刷题记录3

# 10 字符个数统计 描述 编写一个函数&#xff0c;计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 &#xff0c;包括 0 和 127 )&#xff0c;换行表示结束符&#xff0c;不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次 例如&#xff0c;对…

C#系统学习汇总

一、基础篇 C#简介 C#环境 C#程序结构 C#基本语法 C#数据类型 C#类型转换 C#变量 C#常量 C#运算符 C#判断 C#循环 二、中级篇 C#方法 C#可空类型(Nullable) C#数组(Array) C#字符串(String) C#结构体(Struct) C#枚举(Enum) C#类(Class) C#继承(Inheritance)…

解决宝塔的FTP无法使用被动模式

问题&#xff1a;宝塔安装完ftp管理软件之后&#xff0c;无法使用被动模式连接 解决&#xff1a; 提示&#xff1a; 如果还是不行&#xff0c;那么要看看防火墙和安全组有没有放行被动模式的端口&#xff0c;宝塔安装的pure-ftpd软件的被动模式端口默认是39000至400…

Kubernetes 升级不弃 Docker:KubeKey 的丝滑之道

作者&#xff1a;尹珉&#xff0c;KubeSphere Ambaasador&Contributor&#xff0c;KubeSphere 社区用户委员会杭州站站长。 引言 随着 Kubernetes 社区的不断发展&#xff0c;即将迎来 Kubernetes 1.30 版本的迭代。在早先的 1.24 版本中&#xff0c;社区作出一个重要决策…

计算机网络——42攻击和对策

攻击和对策 IDS&#xff1a;入侵检测系统 分组过滤 对TCP/IP头部进行检查不检查会话间的相关性 IDS:intrusion detection system 深入分组检查&#xff1a;检查分组的内容&#xff08;e.g. 检查分组中的特征串&#xff0c;已知攻击数据库的病毒和攻击串&#xff09;检查分组间…

【网站项目】捷邻小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

FPGA - 以太网UDP通信(二)

一&#xff0c;引言 前文链接&#xff1a;FPGA - 以太网UDP通信&#xff08;一&#xff09; 在上文章中介绍了以太网简介&#xff0c;以太网UDP通信硬件结构&#xff0c;以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c;接下来介绍UDP通信结构框图以及数据链路层&#xff…

Python | Leetcode Python题解之第28题找出字符串中的第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; class Solution:def strStr(self, haystack: str, needle: str) -> int:# Func: 计算偏移表def calShiftMat(st):dic {}for i in range(len(st)-1,-1,-1):if not dic.get(st[i]):dic[st[i]] len(st)-idic["ot"] len(st)1re…

自己开发的App如何上架,详细解读App上架操作流程

对于企业或个人开发的App&#xff0c;上架是必经之路。然而&#xff0c;许多人不清楚如何进行App上架。工信部在2023年规定&#xff0c;App必须备案才能上架。那么&#xff0c;让我们一起了解App上架流程吧。 1. 准备上架所需材料 在上架App之前&#xff0c;需要准备应用图标…

类加载子系统

目录 类的加载 加载流程 类的加载器 类的链接 类的检验阶段 类的准备阶段 类的解析阶段 类的初始化 static与final的搭配问题 ()的线程安全性 类的初始化情况&#xff1a;主动使用vs被动使用 类的使用 类的卸载 类、类的加载器、类的实例之间的引用关系 类的生命…

端口协议(爆破、未授权)

常见端口服务及攻击方向&#xff1a; 弱口令爆破 工具&#xff1a;https://github.com/vanhauser-thc/thc-hydra hydra是一个支持多协议的自动化的爆破工具。 支持的服务、协议&#xff1a; telnet ftp pop3[-ntlm] imap[-ntlm] smb smbnt http-{head|get} http-{get|post}-…

Spring Boot与Docker的完美融合:从开发到部署的实战

一、Spring Boot与Docker简介 Spring Boot框架特点与优势概述 Spring Boot 是一个由Pivotal团队开发的用于简化新Spring应用初始搭建以及开发过程的框架。它的核心特点和优势包括&#xff1a; 简化配置&#xff1a;Spring Boot采用约定优于配置的方式&#xff0c;减少了大量的…

深度学习入门(3)

一、感知机 感知机接收多个输入信号&#xff0c;输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。 但是&#xff0c;和实际的电 流不同的是&#xff0c;感知机的信号只有“流 / 不流”&#xff08; 1 / 0 &#xff09;两种取值。在本书中&…