目录
- 命令基本格式
- NR与NF
- 批量kill命令
- 一个简单的替换
awk命令的基本格式
awk '条件类型1{操作1} 条件类型2{操作2} ...' filename
awk常用选项及其含义
-F fs:指定fs作为输入行的分隔符,awk命令默认分隔符为空格或制表符。
-f file:从脚本中读取awk脚本指令,以取代直接在命令行输入指令。
-v var=val:在执行处理过程之前,设置一个变量var,并给其设备初始值为val。
一些内置变量
NF:每一行($0)拥有的字段总数
NR:目前awk所处理的是第几行数据
FS:目前的分隔字符,默认是空格键
写着写着觉得教程够多了,简单分享使用吧
参考《鸟哥的Linux私房菜(第四版)》,没书的话看看C语言中文网awk教程:http://c.biancheng.net/view/4082.html
NR与NF
awk '{print $1 "\t lines:" NR "\t columns:" NF}' test1.txt
逐行处理,打印出每行的第一个字段$1,处理到第几行NR和每行字段数NF
# test1.txt文件内容
cat test1.txt
line11 line12 line13
line21 line22 line23
line31 line32 line33
#################这是一条分割#
批量kill命令
当当前shell窗口运行的命令全部需要kill的时候(命令较多),可以批量kill
ps -ef | grep commandxxx | grep xxx(用户) | awk '{print $2}' | while read id; do kill $id; done
# 先查看命令情况
ps -ef | grep java | grep qiuyinbin | awk '{print $2}' | while read id; do wc -l; done
# 使用示例:批量kill用户qiuyinbin的java命令
ps -ef | grep java | grep qiuyinbin | awk '{print $2}' | while read id; do kill $id; done
# 遇到循环中的命令,要等新的命令运行时再kill,可以加个sleep
ps -ef | grep java | grep qiuyinbin | awk '{print $2}' | while read id; do kill $id;sleep 0.1; done
一个简单的替换
首先,有两个文件query_genename.txt和上调基因列表up.txt
文件情况如下,列之间是tab分隔
$ less -S query_genename.txt
TRINITY_DN9_c5_g1 PPP1R12A
TRINITY_DN9_c4_g1 MAD2L2
TRINITY_DN9_c2_g1 FOPNL
TRINITY_DN9_c1_g1 GGPS1
TRINITY_DN9_c10_g1 CX3CR1
TRINITY_DN9_c0_g1 STRN4
TRINITY_DN99_c4_g1 TDRD12
TRINITY_DN99_c1_g1 WDR37
TRINITY_DN99_c0_g1 ETF1
TRINITY_DN999_c4_g1 FAM92A
TRINITY_DN999_c3_g1 SGCD
TRINITY_DN999_c0_g1 OSBPL9
TRINITY_DN99998_c0_g1 SLC17A4
TRINITY_DN9997_c0_g1 DTYMK
$ less -S up.txt
query C1_Mean C2_Mean FoldChange log2FoldChange FDR
TRINITY_DN2122_c0_g1 131.934049458786 24.5577242060786 5.21580462664745 2.38288983018
TRINITY_DN3132_c0_g1 144.028003992508 25.4672695470445 5.49442801032184 2.45796929925
TRINITY_DN2666_c7_g1 931.234499096598 329.255413429646 2.82325284953719 1.49735834183
TRINITY_DN623_c5_g1 2205.49752678604 677.611279019576 3.25178087581717 1.70123004338
TRINITY_DN5203_c0_g2 447.476317747716 90.9545340965873 4.88085735530767 2.28713458910
TRINITY_DN1236_c0_g1 639.880139875112 230.114971264366 2.77366637828372 1.47179426807
TRINITY_DN623_c3_g1 97.851086681933 15.4622707964198 6.03153331997378 2.5925248067555 2.259
TRINITY_DN6321_c0_g1 182.508768417987 46.3868123892595 3.87790125508826 1.95527606785
目的:使用awk将up文件中的query替换成基因名
awk -F '\t' 'NR==FNR{a[$1]=$2;next}{print a[$1]"\t"$2"\t"$3"\t"$4"\t"$5}' query-genename.txt up.txt > up_genename.txt
解释:
NR和FNR都表示记录数(当前处理的行数),但是NR从1开始记录直到所有文件读取完,FNR则在读取第二个文件时(这里是up.txt),从1开始重新计数。
NR==FNR时,表示读取处理第一个文件query-genename.txt,对这个文件的处理代码在后面的第一个{}内,即{a[$1]=$2;next},将query-genename.txt第一列$1作为数组a的关键字,第二列$2作为该关键字对应的值。
当NR不等于FNR时(表示已经开始处理第二个文件up.txt),执行第二个{}的代码,即{print a[$1]"\t"$2"\t"$3"\t"$4"\t"$5},第一列根据前面得到的数组替换为基因名,并打印2-5列,完成转换。
$ less -S up_genename.txt
genename C1_mean C2_Mean FoldChange log2FoldChange FDR
GPR68 131.934049458786 24.5577242060786 5.21580462664745 2.38288983018137 1.434
B3GALNT1 144.028003992508 25.4672695470445 5.49442801032184 2.45796929925929
ECHDC3 931.234499096598 329.255413429646 2.82325284953719 1.49735834183681 7.650
SHB 2205.49752678604 677.611279019576 3.25178087581717 1.70123004338373 1.075
SH3TC1 447.476317747716 90.9545340965873 4.88085735530767 2.28713458910152 1.082
CRYBG3 639.880139875112 230.114971264366 2.77366637828372 1.47179426807206 0.000
LPGAT1 97.851086681933 15.4622707964198 6.03153331997378 2.5925248067555 2.259213647271e-07
当有些行未转换到时,为空值,可以使用awk去除
awk -F'\t' '{if($1!="") print $0}' up_genename.txt > up_genename_fina.txt