ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

awk场景命令

2021-12-31 20:02:35  阅读:289  来源: 互联网

标签:场景 字符串 命令 sed awk print NR 替换


 

~/Documents/materials/linux_shell 

awk 'BEGIN{FS=OFS="\t"} NR==FNR{a[$3]=$1;b[$3]=$2} NR>FNR{$2=a[$1];$3=b[$1];print $2,$3,$1}' snp.raw snp.list >sub.txt

#awk 一个文件遍历完成后,再遍历下一个文件

 #分号;表达式。

# 逗号, 并列 不换行

 

Awk 模式-动作,如果动作省略,会默认输出符合模式(条件)的行,当然模式也可以省略。 正因为二者都可以省略,所以需要用大括号把动作括起来,以作区分。 模式决定动作什么时候执行。动作中多条语句用换行符或分号分开

Awk 的print语句由逗号隔开的,输出时默认用一个空格符号隔开

NF :输入行的字段数量。 $NF:这行最后一个字段 ,$(NF-1)当前输入行的倒数第二个字段。

NR:计算到目前为止,读取到的行的数量

 

print 用于简单快速的输出

Printf 格式化输出。如:{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) } 

正则表达式 //匹配

运算符:或且非

&& ,||,! 且 或非

  • BEGIN 模式:是指 awk 将在读取任何输入行之前立即执行BEGIN 中指定的动作。
  • END 模式:是指 awk 将在它正式退出前执行 END中指定的动作。

 

正则表达式 [之后(里面)的^ 表示非  []是匹配只一个,1个以上得[]+,任意多即[]*,*表匹配0个或多个。

正则表示式[]里面的-表示范围

 

范围模式由逗号隔开的模式组成,如:pat1,pat2范围模式匹配多个输入行,从匹配pat1的行开始,到匹配pat2的行结束;如果part2一直没有匹配到,那么会自pat1匹配行开始一直输出到文件输入结束。

内建变量FILENAME表示当前输入文件名

内建变量FNR表示从当前输入文件中,到目前为止读取到的行数。如:awk 'FNR == 1,FNR == 5 { print FILENAME ":" $0 }' summary.py 输出1-5行 或 FNR<=5 {print $0}  

awk 'FNR == 1||FNR == 5 { print FILENAME ":" $0 }' summary.py 输出第1行、5行

awk不需要声明变量类型,awk会根据上下文环境,推断出变量类型,如是字符串还是数字 如:100*$2 这里如果原$2不是数值,就会转换为数值。如果字段变量引用到不存在的字段如总共4列,$5默认是空字符串或0。

FS 输入行的字段分割符

OFS输出字段分割符,默认是“ ”; ORS 输出记录的分割符,默认是“\n”

可以给每个字段变量重新赋值,再调用如:

    BEGIN {FS=OFS=“\t”}. #BEGIN 动作设置FS与OFS

    $4 == "North America" { $4 = "NA" }

    $4 == "South America" { $4 = "SA" }

{ print } 

注:awk通常将字段数上限设置为100

匹配运算符~和!~ 如:awk '$0!~ /D2003005089/ {print $0}' optitye_45.sh >optitye_45_new.sh。 把不含样本D2003005089的行输入到optitye_45_new.sh

支持三元运算符,expr1 ? expr2 : expr3   如:{ print ($1 != 0 ? 1/$1 : "$1 is zero, line " NR) } 

awk -F " " ' NF>=5 {print $0}' light_cat_146.sh 把文件不存在的命令删除掉

Awk的拼接符,即陆续写出字符串常量,变量,树组元素,函数返回值等。如{print NR “:” $0} #自定义变量和NR等内建变量不需要$

Awk 的正则表达式字符串,会对表达式的字符串自行求值后解释,不需像python一样先编译成正则表达式对象。如BEGIN { digits = "^[0-9]+$" }

$2 ~ digits

被双引号包围的字符串被awk解析时,起保护作用的反斜杠会被移除,所以还需要额外的反斜杠来保护它自己。如    $0 ~ /(\+|-)[0-9]+/  与$0 ~ "(\\+|-)[0-9]+" 等价

 

awk 'BEGIN{print ARGV[1]}NR==1,NR==12 {print $1}' D2002002822.deduped.bam/D2002002822.deduped.bam.type >>/zfssz4/BC_RD_P2/USER/huangshujia/projects/lizhichao/SARS-CoV-2/HLA_Typing/precison/king7.type #打印文件名和打印1到12行内容

 

awk 比较两个值,如果都是数值,那么比较按数值进行。否则数值类型的操作数被强制转换成字符串,再按字符串的方式进行比较。

 

awk sub 是只替换一次,sub(r,s,t) 默认t是整个字符串,(如果指定t域如$1则就只在t指定域内)替换一次。相当于 sed 's//'  。如$ awk '{ sub(/test/, "mytest", $1); print }' testfile

 

awk gsub  全局替换   ,gsub (regular expression, substitution string, target string)  默认是整个记录,如有指定第三个t域,则将替换t域内的r为s,相当于 sed 's//g'  。如:$ awk '{ gsub(/test/, "mytest", $1); print }' testfile

 

注:sub和gsub返回值都是替换次数,所以如果想print替换次数就将替换表达式赋值给字段,如果想print 替换结果不需单独赋值,如:

echo "a b c 2011-11-22 a:d" | awk '$4=gsub(/-/,"",$4)'  返回 a b c 2 a:d

echo "a b c 2011-11-22 a:d" | awk 'gsub(/-/,"",$4) 返回 a b c 20111122 a:d

echo "a b c 2011-11-22 a:d" | awk '$5=gsub(/-/,"",$4)' 返回 a b c 20111122 2

 

substr(s,p,n) 返回s中从p位置开始长度为n的子字符串,没有指定n则将从p位置后所有字符串输出。{ $1 = substr($1, 1, 3); print $0 }

 

流程控制: awk提供花括号用于语句组合。

如:

if (expression) statements1

else

statements2

 

 

 

 

awk 账号列
lastlog |awk '{if ($4=="in**") print $1,"\t",$2,$3,$4; else print $1"\t"$9"-"$5"-"$6,$7}' >lastlog.txt

相关博客1:http://www.cnblogs.com/sunada2005/p/3493941.html
计算第一列加和。
awk '{sum += $1};END {print sum}' test2

awk 处理每一行的字段内的数据,而默认的字段的分隔符为空格键或Tab键
$0表示某一行数据
$1第一列数据
$2第二列数据
...第..列数据
awk'条件类型{动作1}条件类型{动作2}...' filename
awk所有动作 单引号括住
awk内在变量
NF:每一行所拥有的字段总数
$NF 即最后一列
NR:目前在第几行
FS:目前的分割字符,默认是空格键

转自http://www.cnblogs.com/sunada2005/p/3493941.html

{}括起多个命令
BEGIN读取文件前初始化 ,如页眉
END 扫尾,用于最终计算或打印应该出现在结尾的信息。

实例:取fastq文件5‘端前50个base的命令;
awk '{if (NR%4==2|NR%4==0){print substr($0,1,50)}else{print $0}}'your.fq
取3’端后50个base
awk '{if (NR%4==2||NR%4==0){print substr(($0),length($0)-50+1)}}'your.fq
数fq.gz read碱基数 : zcat CL100006359_L01_1_1.fq.gz |awk '{if (NR%4==2){print length($0)}}'

二、awk内置函数substr 截取字符串

返回从起始位置起,指定长度之子字符串;若未指定长度,则返回从起始位置到字符串末尾的子字符串。
格式:
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
例子:
1
2
[root@test ~]# echo "123" | awk '{print substr($0,1,1)}

zcat input_file.fastq.gz | awk 'NR%4==1{printf ">%s\n", substr($0,2)}NR%4==2{print}' > output_file.fa
以字符串形式打印输出变量str后光标换行

awk其他内置参数
ARGC 命令行参数的个数
ARGV 命令行参数数组
ARGIND 当前被处理文件的ARGV标识符
NR 已经读出的记录数
FNR 当前文件的记录数
举例 显示文件第1-3行 awk'NR==1,NR==3{print}' test.fa
FS 输入字段的分隔符,相当于-F默认为:space:
举例 awk -F ':'{print} test.fa 等同awk''BEGIN{FS=":"} test.fa

http://www.zsythink.net/archives/tag/awk/
sed
nl /etc/passwd |sed '2,5 d' 删除文件2-5行
nl命令 输出的文件内容自动加上行号
sed [-nefr] [动作] 以行为单位
1.
-n 仅显示script 处理后的结果
-e 在命令行模式进行sed的动作编辑
-f 后接script文件名
-r 支持扩展式正则表达式
-i 直接修改文件内容,不打印输出
2.动作
[n1[[2]]function sed后用单引号括起
n1 n2表行号
function参数
2.1以行为单位 删除新增
a: 新增字符串为新的一行出现在下一行 sed'2a drink tar'第二行后面
d: 删除
2.2 行为单位,替换、显示
整行替换: nl /etc/passwd |sed ‘2,5c No 2-5 number’
c:后接字符串替换 n1,n2之间的行
显示整行: nl /etc/passwd |sed -n '5,7p' 直接取处5-7行打印
-n不重复输出
p:将sed-n 数据打印出来

2.3替换部分数据:sed's/要被替换的字符串、新的字符串/g'
s:替换。搭配正则表达式
如: /sbin/ifconfig ech0 |grep 'inet addr' | sed 's/^.*addr://g'
例1取出一个字符串的前50个字符 cat your.fa | grep -v ">" | sed -r 's/(.{50}).*/\1/g
例2.去掉sRNA 的fasta中N序列。 sed 'N;s/\n/\t/'sRNA.fa|sed -e '/\t.*N/d'|tr"\t""\n"


$cat 20171231_SZ_hfpc_info.csv | awk -F "," '{print $1}' |uniq -c -d #判断某行是否有重复值
# 分隔符 script

Awk 可以作为管道符号接在其他命令后面,输出一部分内容。

https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_71/com.ibm.aix.cmds1/awk.htm

标签:场景,字符串,命令,sed,awk,print,NR,替换
来源: https://www.cnblogs.com/koujiaodahan/p/15754299.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有