awk使用

awk 处理数据挺方便的,整理下使用方法。

先看下最简单的用法

下面是数据,文件名pic.csv

10371029    130657404  33250828600
10375462   0  32754488348
10401830   130670653  33301943326
10490532   130818323  33390650001,33390638503
10492736   130808000  33392915994,33392923278,33392951671,33392965894
10501933   130847315  33426734671,33426784141,33426741368
10520323   130871605  33474622551
10561441   130900744  33569740772
10563686   130931058  33572560455,33572597666,33572625609
10594334   130933942  33595945445,33595930712
10609164   130968431  33625612546
10623734   130960850  33655945376
10625513   130985226  33659411835,33659434639
10662700   131036062  33748007817
10688362   131050019  33802663455
10744503   131143877  33909572401,33909557630
10749313   131138769  33912184752
10777611   131181015  33975768553
10790647   131192937  34013919173,34013904105,34013909379
10790833   131198786  34014605153,34014654005,34014895558,34014920756
10799709   131213531  34039005481
10805941   131221289  34048620033,34048637653
10806145   131228025  34049593438,34049617769,34049618566,34049596717
10837378   131259345  34138112374,34138156606
10847268   131293940  34163393641,34163387864

只看前两列

awk '{print $1,$2}' pic.csv

数据过滤,只看第一列数字为10847268

awk ' $1==10847268' pic.csv

内建变量
说到了内建变量,我们可以来看看awk的一些内建变量:

$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
root    0       /root
bin     1       /bin
daemon  2       /sbin
adm     3       /var/adm
lp      4       /var/spool/lpd
sync    5       /sbin

如果把文件第一列用逗号分隔,可以用

awk 'ORS="," {print $1}' pic.csv