awk学习笔记

视频链接

无意间在B站看到一个up做的awk入门教程,思路清晰,没有废话,所以花了一个多小时学习了下,分了3集:

  • 基础
  • 内部变量
  • 正则表达式

老年人健忘..还是做个笔记吧,下面是视频链接:
awk入门教程-upload by 正月点灯笼

基础

  • NR number of record
  • NF number of filed
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print NR "\t" $1 "\t" $2 "\t" $3}' tmp1.xls 
1   transcript_id   Bt_F_FPKM   J_F_FPKM
2   Gh_A01G0001 0.424353    0.580204666667
3   Gh_A01G0002 1.372276    1.12152666667
4   Gh_A01G0003 2.755143    2.54099033333
5   Gh_A01G0004 30.8250546667   29.1618696667
6   Gh_A01G0005 8.28325366667   10.730383
7   Gh_A01G0006 13.7739286667   11.6380556667
8   Gh_A01G0007 3.910698    4.715743
9   Gh_A01G0008 0.581012    1.11709433333
10  Gh_A01G0009 6.04281033333   7.47224133333

shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print NR, $0}' tmp1.xls
1 transcript_id Bt_F_FPKM   J_F_FPKM    BtJ_F_FPKM
2 Gh_A01G0001   0.424353    0.580204666667  0.48476
3 Gh_A01G0002   1.372276    1.12152666667   1.22913966667
4 Gh_A01G0003   2.755143    2.54099033333   2.96335666667
5 Gh_A01G0004   30.8250546667   29.1618696667   29.7063626667
6 Gh_A01G0005   8.28325366667   10.730383   10.7914463333
7 Gh_A01G0006   13.7739286667   11.6380556667   13.528866
8 Gh_A01G0007   3.910698    4.715743    4.198037
9 Gh_A01G0008   0.581012    1.11709433333   0.942497666667
10 Gh_A01G0009  6.04281033333   7.47224133333   6.05517166667

shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print NF "\t" $0}' tmp1.xls
4   transcript_id   Bt_F_FPKM   J_F_FPKM    BtJ_F_FPKM
4   Gh_A01G0001 0.424353    0.580204666667  0.48476
4   Gh_A01G0002 1.372276    1.12152666667   1.22913966667
4   Gh_A01G0003 2.755143    2.54099033333   2.96335666667
4   Gh_A01G0004 30.8250546667   29.1618696667   29.7063626667
4   Gh_A01G0005 8.28325366667   10.730383   10.7914463333
4   Gh_A01G0006 13.7739286667   11.6380556667   13.528866
4   Gh_A01G0007 3.910698    4.715743    4.198037
4   Gh_A01G0008 0.581012    1.11709433333   0.942497666667
4   Gh_A01G0009 6.04281033333   7.47224133333   6.05517166667

shawnwx@DrdeMacBook-Pro Kmeans$ awk '$1 == "Gh_A01G0007"{print}' tmp1.xls 
Gh_A01G0007 3.910698    4.715743    4.198037
# 说明Gh_A01G0007是一个字符串而非变量

内部变量

NR NF FS

# 限定NR == 7打印第7行
shawnwx@DrdeMacBook-Pro Kmeans$ awk 'NR == 7{print}' tmp1.xls 
Gh_A01G0006 13.7739286667   11.6380556667   13.528866
shawnwx@DrdeMacBook-Pro Kmeans$ awk 'NF == 4{print}' tmp1.xls 
# 限定NF == 7打印filed为7的行
transcript_id   Bt_F_FPKM   J_F_FPKM    BtJ_F_FPKM
Gh_A01G0001 0.424353    0.580204666667  0.48476
Gh_A01G0002 1.372276    1.12152666667   1.22913966667
Gh_A01G0003 2.755143    2.54099033333   2.96335666667
Gh_A01G0004 30.8250546667   29.1618696667   29.7063626667
Gh_A01G0005 8.28325366667   10.730383   10.7914463333
Gh_A01G0006 13.7739286667   11.6380556667   13.528866
Gh_A01G0007 3.910698    4.715743    4.198037
Gh_A01G0008 0.581012    1.11709433333   0.942497666667
Gh_A01G0009 6.04281033333   7.47224133333   6.05517166667

# 如果不加文件名的话bash会进入一个awk命令状态,下面输入什么他就会按照awk命令的指示输出
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print $1, $2}'
hello world
hello world
## awk默认的分隔符为空格
hello, world
hello, world
hello,world 123 456
hello,world 123
# ===============定义全局变量================
## 用BEGIN开始,在BEGIN{}里面用FS定义分隔符为,
shawnwx@DrdeMacBook-Pro Kmeans$ awk 'BEGIN{FS=","} {print $1, $2}'
hello world 123 456
hello world 123 456 
## 由于input中用空格分割的,但是刚才定义了分割符是,所以这里把所有的都看成一列
hello,world,123,456
hello world
## awk的输入分隔符和输出分隔符不同,虽然这里修改了默认的输入分隔符为,但是输出分割符仍旧是空格。
shawnwx@DrdeMacBook-Pro Kmeans$ awk 'BEGIN{OFS=","} {print $1, $2}'
hello world 123 456
hello,world
awk 'BEGIN{FS=","; OFS=","} {print $1, $2}'
hello,world,123,456
hello,world
shawnwx@DrdeMacBook-Pro Kmeans$ awk 'BEGIN{FS=","; OFS="\t"} {print $1, $2}'
hello,world,123,456
hello   world
# ===============FILENAME==================
## 如果一个awk后面接两个file会自动把file2接到file1下面,无法区分,这时候加上FILENAME就会显示从第几行开始时file2
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print NR, FILENAME, $0}' tmp1.xls tmp2.xls 
1 tmp1.xls transcript_id    Bt_F_FPKM   J_F_FPKM    BtJ_F_FPKM
2 tmp1.xls Gh_A01G0001  0.424353    0.580204666667  0.48476
3 tmp1.xls Gh_A01G0002  1.372276    1.12152666667   1.22913966667
4 tmp1.xls Gh_A01G0003  2.755143    2.54099033333   2.96335666667
5 tmp1.xls Gh_A01G0004  30.8250546667   29.1618696667   29.7063626667
6 tmp1.xls Gh_A01G0005  8.28325366667   10.730383   10.7914463333
7 tmp1.xls Gh_A01G0006  13.7739286667   11.6380556667   13.528866
8 tmp1.xls Gh_A01G0007  3.910698    4.715743    4.198037
9 tmp1.xls Gh_A01G0008  0.581012    1.11709433333   0.942497666667
10 tmp1.xls Gh_A01G0009 6.04281033333   7.47224133333   6.05517166667
11 tmp2.xls Gh_Sca277334G01 0   0.0122663333333 0
12 tmp2.xls Gh_Sca278127G01 0   0   0
13 tmp2.xls Gh_Sca278164G01 0   0   0
14 tmp2.xls Gh_Sca280882G01 0   0   0
15 tmp2.xls Gh_Sca283304G01 0.110361333333  0.050783    0.0192516666667
16 tmp2.xls Gh_Sca284875G01 0   0   0
17 tmp2.xls Gh_Sca286293G01 0.445272333333  0.442850333333  0.595937
18 tmp2.xls Gh_Sca286786G01 0   0   0
19 tmp2.xls Gh_Sca287394G01 0   0   0
20 tmp2.xls Gh_Sca288207G01 0   0   0
# ================隐藏某列==============
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{$2="xxx";print $0}' tmp1.xls 
transcript_id xxx J_F_FPKM BtJ_F_FPKM
Gh_A01G0001 xxx 0.580204666667 0.48476
Gh_A01G0002 xxx 1.12152666667 1.22913966667
Gh_A01G0003 xxx 2.54099033333 2.96335666667
Gh_A01G0004 xxx 29.1618696667 29.7063626667
Gh_A01G0005 xxx 10.730383 10.7914463333
Gh_A01G0006 xxx 11.6380556667 13.528866
Gh_A01G0007 xxx 4.715743 4.198037
Gh_A01G0008 xxx 1.11709433333 0.942497666667
Gh_A01G0009 xxx 7.47224133333 6.05517166667
# ===============打印文本最后一列=========
# 有些情况下某些列里的字符有空格,空格又是awk默认的分隔符,所以在特殊情况下要打印最后一列并不能用print $具体第几列,或者遇见列数不一致的文本也是这样,所以用print $NF
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print $NF}' tmp1.xls 
BtJ_F_FPKM
0.48476
1.22913966667
2.96335666667
29.7063626667
10.7914463333
13.528866
4.198037
0.942497666667
6.05517166667
# 同理,打印倒二列
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{print $(NF-1)}' tmp1.xls 
J_F_FPKM
0.580204666667
1.12152666667
2.54099033333
29.1618696667
10.730383
11.6380556667
4.715743
1.11709433333
7.47224133333
# =============自定义变量=================================
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=3; print a + b}'

4
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=3; print a b}'

13
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=3; print a - b}'

-2
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=3; print a * b}'

3
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=3; print a / b}'

0.333333
# 取余
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=3; print a % b}'


1
shawnwx@DrdeMacBook-Pro Kmeans$ awk '{a=1; b=2; c=3; print a b+3}'

15

第三讲 Regular Expression 正则表达式

  1. 书写正则表达式用//
  • /abc/ “abc” “xxxabc” "xxabc" "a bc"
shawnwx@DrdeMacBook-Pro Kmeans$ awk '/abc/{print $0}' tmp3.txt 
abc
xxabc
xxabcxx
  1. /a.c/ 表示一个字母a中间任意字符然后字母c
  • “abc" "aac" "acc" "adc" "a c" "a.c" "abbc"
shawnwx@DrdeMacBook-Pro Kmeans$ awk '/a.c/{print $0}' tmp3.txt 
abc
xxabc
xxabcxx
# .只能代表一个字符位,如果多于一个字符也匹配不到
shawnwx@DrdeMacBook-Pro Kmeans$ cat tmp3.txt 
abc
xxabc
xxabcxx
a bc
a b c 
ab c
  1. /a(\).c/ 反斜杠\表示转义字符,没有那个括号,可能和markdown语法冲突了...这样表示精确查找a.c
shawnwx@DrdeMacBook-Pro Kmeans$ vim tmp3.txt 
shawnwx@DrdeMacBook-Pro Kmeans$ awk '/a\.c/{print $0}' tmp3.txt 
a.c
# 如果提取时遇到例如/\?.等awk认定的特殊字符都需要在前面加上\
/a\/c/
/a/c/
/a\\c/
/a\c/
/a\?c\
/a?c/
  1. ^ 和 $
  • /^abc/表示abc一定要出现在字符串的最前面 “abc" "abcxx" "abcxxxx" "abc...." "aabc" "dabc" "xxabc"
  • /abc$/表示abc一定出现在匹配字符串的结尾 “abc" "abcxx" "abcxxxx" "abc...." "aabc" "dabc" "xxabc"
shawnwx@DrdeMacBook-Pro Kmeans$ awk '/^abc/{print $0}' tmp3.txt 
abc
shawnwx@DrdeMacBook-Pro Kmeans$ awk '/abc$/{print $0}' tmp3.txt 
abc
xxabc
  1. []
  • /a[bdf]c/ 表示a和c之间只能是方括号中bdf中间的一个字母 "abc" "adc" "afc" "aec" "abbc" "a.c"
  • /a[a-z]c/ 表示a和c之间为a-z(小写)的 "abc" "adc" "afc" "aec" "abbc" "a.c" "Aac" "aBc"
  • /a[a-zA-Z]c/ 这样中间可以是任意大小写的字符串"abc" "adc" "afc" "aec" "abbc" "aBc" "a.c" "Aac"
  • /a[^a-z]c/ ^如果在[]之内表示取反,这个正则表达式的意思是a和c之间的不是小写"abc" "adc" "afc" "aec" "abbc" "aBc"
shawnwx@DrdeMacBook-Pro Kmeans$ awk '/a[bdf]c/{print $0}' tmp3.txt 
abc
xxabc
xxabcxx
  1. *和+
  • /ab/这里的不是通配符的意思,也不是乘号,而是指不限制a的个数a可以是0-无限大个 "b" "ab" "aaab" "aaaaaab"
  • /a+b/ 这里的+不是表示加号,而表示a至少出现一次 ** "ab" "aab" "aaaab"** "b"
  1. ?
  • /a?b/ ?表示a可有可无 ** "ab" "b‘** ”a"
  1. {}
  • /ab{3}c/ 表示b必须出现3次 "abbbc" /ab{3,4}c/表示b可以出现3次也可以出现4次 "abbbc" "abbbbc" /ab{3,}c/这意思是a后面至少有3个b然后是一个c "adfasdfabbbcxxxxx" "abbbc"
    9 ()
  • /(ab)+c/ 之前/ab+c/表示b要反复出现,把他们括起来以后表示ab要反复出现 "abababababc"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351