【精选】【linux】awk常用处理文件命令示例 | 您所在的位置:网站首页 › 心魔电影完整版视频 › 【精选】【linux】awk常用处理文件命令示例 |
一个示例文件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 实验室设备网 版权所有 |