awk学习笔记

因为自己shell脚本不怎么会就想着刷点题目看看哪里是盲点.然后leetcode上shell分类很少,就四道,前面两道简单的没啥说的,后面两道用到了awk,恰好也是自己不会的,趁着这个机会翻阅资料学习并记录下来以备后面翻阅

一. 概述

awk 是一个强大的文本分析工具.他的工作流程是按行读入文本数据,然后默认以空格分隔切分行数据.然后切分开的部分按照指定的语句进行处理.

其中我们常用的应该是gawk.他是GNU版本的AWK实现.相当于就是一种工具.然后我第一次写是用的mawk,他相当于是awk语言的解释器.这两者我在做题时仅仅遇到了一处不一样的地方,就是对二维数组的支持.

gawk应该是完全支持的,格式如下即可使用:

array_name[i][j]

在mawk中则是以另外一种形式支持二维数组:

array_name[i,j]

这边暂时还是以gawk为主.

二. awk基本说明

这边我个人使用过程中的一个模板是这样的:

awk [-F filed-separator] 'pattern{command}' file-source

其中 -F 指定分隔符,默认是空格.pattern是匹配原则.{}中是处理命令,最后则是数据源

有两个特殊的pattern:BEGINEND.

BEGIN{command}

BEGIN是指在读入数据之前匹配成功,所以BEGIN后接的指令是在读取数据之前执行.可以用来做变量声明以及初始化等等

END{command}

END是指处理完文件后匹配成功.所以后面接的指令是在读取数据完成之后执行的,可用来清理现场或者处理结果

然后有部分内置变量说明下(详细的可去官网查看):

NR 已读取的记录数

NF 记录域的个数

FILENAME 浏览的文件名

针对NF,其中 $n是用来获取对应域的数据的.不过比较不同的是下标从1开始,0表示的是该行全部数据.

一个最简单的例子:
文件file.txt如下

name age
evan 12
gkond 13
awk '/va/{print $2}'  file.txt

这个就是当读入的数据能和va匹配时就输出第二个域.这里只有evan中含有va,所以输出的就是12.

其中awk是支持编程的,整体语句规范类似C.

三. 实例

3.1 转置文件

给定一个文件 file.txt,转置它的内容。

你可以假设每行列数相同,并且每个字段由 ' ' 分隔.

示例:

假设 file.txt 文件内容如下:

name age
alice 21
ryan 30
应当输出:

name alice ryan
age 21 30

这个最直观的一个想法就是创建一个二维数组res[NF][NR],然后按照每个域输出数据即可.

所以具体代码如下:

awk 'BEGIN{
    col=0;row=0;
}
{
    for(i=1;i<=NF;i++){
        res[NR,i]=$i
    }
    col=NF;
    row=NR
}END{
    for(i=1;i<=col;i++){
        for(j=1;j<=row;j++){
            if(j!=row){
                printf("%s ",res[j,i])
            }else{
                 printf("%s\n",res[j,i])
            }
        }
    }
}' file.txt

其中如果使用的是gawk的话,res[j,i]的格式可以写成res[j][i]

上面的代码是为了说明二维数组的使用的,其实还有一种就是一维数组直接存储拼接好的字符串,效率也会更高,代码如下:

awk '{
    for (i = 1; i <= NF; ++i) {
        if (NR == 1) s[i] = $i;
        else s[i] = s[i] " " $i;
    }
} END {
    for (i = 1; s[i] != ""; ++i) {
        print s[i];
    }
}' file.txt

这里代码的意思就是每行进来时,遍历每个域,第i个域就拼到s[i]中,如果是第一行就直接拼接,如果不是第一行就得多加个空格拼接.处理完成之后就是输出了.

3.2 统计词频

写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。

为了简单起见,你可以假设:

words.txt只包括小写字母和 ' ' 。
每个单词只由小写字母组成。
单词间由一个或多个空格字符分隔。
示例:

假设 words.txt 内容如下:

the day is sunny the the
the sunny is is
你的脚本应当输出(以词频降序排列):

the 4
is 3
sunny 2
day 1
说明:

不要担心词频相同的单词的排序问题,每个单词出现的频率都是唯一的。
你可以使用一行 Unix pipes 实现吗?

这里我看到的最佳答案是通过pipe拼接多个命令完成的:

cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -r | awk '{print $2" "$1}'

这里代码的意思是:获取文件内容,然后交给tr做字符替换,空格转换为换行,接着升序排序,再交给uniq做去重并统计,统计的结果在交给sort处理成降序,最后交给awk按照第二个域 第一个域的格式输出.

当然也可以将大部分操作交给awk做:

awk '{
        for(i=1;i<=NF;i++){
            res[$i]+=1;
        }
}END{
        for(i in res){
            print i " " res[i]
        }
}' words.txt | sort -nr -k 2

这里就是用单词做下标,次数做value来存储数据,然后按照第二个pos倒序排列.

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

推荐阅读更多精彩内容

  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,564评论 0 4
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,271评论 0 8
  • Linux指令中文说明传送入口 整理自Linux指令中文说明 文本和数据进行处理的编程语言awk 是一种编程语言,...
    释闲人阅读 2,123评论 1 6
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,457评论 0 9
  • 一. AWK 说明 awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并...
    西华子阅读 933评论 0 4