【精选】【linux】awk常用处理文件命令示例 您所在的位置:网站首页 心魔电影完整版视频 【精选】【linux】awk常用处理文件命令示例

【精选】【linux】awk常用处理文件命令示例

2023-11-10 05:35| 来源: 网络整理| 查看: 265

一个示例文件myfile.txt:(Tab分割:“\t”)

head1head2head3head4head5aaabbbAAccddCCABCD10XaabbbAYccddCCAbCD22aXaXbbAAycddZCABcD35aaXbXXAAcyddCZABCd199

需求1: 将第1列替换字符中的X都替换为A:

awk '{gsub(/X/,"A",$1); print}' myfile.txt awk '{gsub(/X/,"A",$1); print $0}' myfile.txt awk -F"\t" '{OFS="\t"}{gsub(/X/,"A",$1); print $0}' myfile.txt awk '{FS="\t"; OFS="\t"}{gsub(/X/,"A",$1); print $0}' myfile.txt

以上4个命令是等价的。

代码1: 解释命令参数

命令/参数说明$0/$1awk基本命令,获取所有列;$1: 获取第一列,$2: 获取第二列,$3: … 。gsub使用gsub函数对字符(串)替换。gsub函数参数 gsub(/原字符(串)正则表达式/, 修改字符(串), [指定列,默认所有列])。-F/FS指定输入的列分割字符,默认是空白字符。示例代码指定Tab “\t”。 注意,如果自定义指定了输入列的分隔符,默认的输出分割符是一个空格。 如输出列还按tab分割,需要指定OFS。OFS输出的列分割符。print默认print的是所有列,也可使用$0,$1,…指定输出的列。

生成结果:

head1head2head3head4head5aaabbbAAccddCCABCD10AaabbbAYccddCCAbCD22aAaAbbAAycddZCABcD35aaAbAAAAcyddCZABCd199

例:去除bed文件中的chr字符

awk '{ gsub(/chr/,""); print $1"\t"$2"\t"$3 }' test.bed

也可用sed实现:

sed 's/^chr//g' test.bed

需求2: 格式化输出

代码2:

awk '{printf ("%-30s\t%.10f\t%.4f\n",$1,$5*2,$2/10}') myfile.txt

解释:第一个逗号,之前为指定的格式,之后为对应格式的值。该示例输出为:原文件第一列【格式为30个字符宽度】,TAB分割,原文件第5列乘2【格式为保留10位小数】,TAB分割,原文件第2列除以10【格式为保留4位小数】。

使用int直接输出整型:

awk '{print int($1)}' myfile.txt

需求3:条件输出if

awk '{if(NR==3){print $0}}' myfile.txt # 输出文件第3行 awk '{if($2>=1){print}}' myfile.txt # 输出文件"第2列值>=1"的行 awk '{if($5=="ABC")print}' myfile.txt # 输出文件第3列字符为"ABC"的行

awk根据条件,也可不使用print默认输出整行,更简洁:

awk 'NR==3' myfile.txt # 输出文件第3行 awk '$2>=1' myfile.txt # 输出文件"第2列值>=1"的行 awk '$5=="ABC"' myfile.txt # 输出文件第3列字符为"ABC"的行

使用或||和且&&条件判断:

awk '$1=="aa" || $3=="bb"' myfile.txt # 第1列为'aa'或第3列'bb'的行 awk '$1!="aa" && $3!="bb"' myfile.txt # 第1列不等于'aa'且第3列不等于'bb'时的行

使用正则匹配:

awk '{if($1~/^AB/)print}' myfile.txt # 输出第1列开头是"AB"的行 awk '{if($1~/AB$/)print}' myfile.txt # 输出第1列末尾是"AB"的行 awk '{if($1~/^AB$/)print}' myfile.txt # 第1列开头和末尾之间是"AB",相当于输出第1列等于"AB"的行

正则匹配:

表达式字符说明~匹配表达式!~不匹配表达式[0-9]匹配0~9数字+匹配一个或多个?匹配0个或1个,比如,匹配第1列是0-99M: $1~/[0-9]?[0-9]M/|匹配或,比如,匹配第1列的9M或10M: $1~/9M|10M/ awk '{if($6!~/^[0-9]+M$/)print}' myfile.txt # 匹配第6列是"数值M"的格式,例如:100M, 120M, 80M

例:输出fastq文件中的序列行,取余%:

awk '{if(NR%4==2){print}}' yourfq # 每4行为一组,只输出第2行

用sed同理实现获取指定行:

# 同 sed -n sed -n '3p' myfile.txt # 输出第三行

需求4:计算某列的和

awk '{sum += $3}END{print sum}' myfile.txt

解释:将第3列累加,END是指最后执行的命令,即在累加后在最后输出累加的值sum。

需求5:大小写转换

awk '{print toupper($1)}' myfile.txt # 第1列转大写 awk '{print tolower($1)}' myfile.txt # 第1列转小写

需求6:获取子字符串;根据长度获取子字符串

awk '{print substr($1,5,2)}' myfile.txt # (1) 取子字符串 awk '{print substr($1,1,length($1)-3)}' file # (2) 根据字符长度取子字符串

(1) 解释:取第一列,从第5位开始,往后取2个字符。 (2) 解释:取第一列,从第1位开始,往后取第1列总长度-3个字符。

需求7:根据指定字符对某列进行分割

awk -F "\t" '{OFS="\t"}{split($1, spA, ":"); print spA[2]}' myfile.txt

解释:输入文件以"\t"分割、输出也是"\t"。对第1列按冒号:分割,定义分割后的列表为spA,输出spA[2]即冒号分割的第2列。比如如下文件,":"分割第一列输出的第二个为b1, b2。

head1head2head3aa:b1:ccx1:yy:zzabcdefaa:b2:ccx2:yy:zzabcdef

需求8:传入变量

x1=ABC # 外部定义的变量 awk -v localx1="${x1}" {print localx1"\t"$1} myfile.txt

使用 -v参数增加变量,如果有多个变量,使用多个-v即可:

x1=ABC x2=EFG awk -v localx1="${x1}" -v2 localx2=${x2} {print $1"\t"localx1"\t"localx2} myfile.txt

需求9:文件格式转置

awk '{i=1; while(i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有