Linux awk的使用

目录

  • 命令基本格式
  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355