~/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