linux awk命令总结

1.  除去重复项, 这个不多说, 只给出代码:
awk '!a[$0] ' file(s)                 
awk '!($0 in a){a[$0];print}' file(s)  

另一种:http://bbs.chinaunix.net/thread-1859344-1-1.html

2. 计算总数(sum),如:
awk  '{name[$0] =$1};END{for(i in name) print  i, name[i]}'

再举个例子:

echo "aaa 1
aaa 1
ccc 1
aaa 1
bbb 1
ccc 1" |awk '{a[$1] =$2}END{for(i in a) print i,a[i]}'
aaa 3
bbb 1
ccc 2

3. 查看文件差异。
cat file1
aaa
bbb
ccc
ddd
cat file2
aaa
eee
ddd
fff

<1>  合并file1和file2,除去重复项:
awk 'NR==FNR{a[$0]=1;print}   #读取file1,建立数组a,下标为$0,并赋值为1,然后打印
NR>FNR{                   #读取file2
if(!(a[$0])) {print }      #如果file2 的$0不存在于数组a中,即不存在于file1,则打印。
}' file1 file2
aaa
bbb
ccc
ddd
eee
fff

<2> 提取文件1中有,但文件2中没有:
awk 'NR==FNR{a[$0]=1}           #读取file2,建立数组a,下标为$0,并赋值为1
NR>FNR{                   #读取file1
if(!(a[$0])) {print }      #如果file1 的$0不存在于数组a中,即不存在于file2,则打印。
}' file2 file1
bbb
ccc

另:http://bbs.chinaunix.net/viewthr ... &page=1#pid15547885

4.  排序:
echo "a
1
0
b
2
10
8
100" |
awk '{a[$0]=$0} #建立数组a,下标为$0,赋值也为$0
END{
len=asort(a)      #利用asort函数对数组a的值排序,同时获得数组长度len
for(i=1;i<=len;i ) print i "\t"a[i]  #打印
}'
      0
      1
      2
      8
      10
      100
      a
      b

5.  有序输出:采用(index in array)的方式打印数组值的顺序是随机的,如果要按原序输出,则可以使用下面的方法:http://bbs2.chinaunix.net/viewthread.php?tid=1811279
awk '{a[$1]=$2
c[j ]=$1}
END{
for(m=0;m
}'

6.  多个文本编辑:这里主要指的是待处理的文本之间的格式上有区别,如分隔符不同,;或是待处理文本需提取的信息的位置不同,如不同的列或行。
<例1>:
cat file1
g1.1 2
g2.2 4
g2.1 5
g4.1 3
cat file2
g1.1 2
g1.2 3
g4.1 4
cat file3
g1.2 3
g5.1 3

要求输出:
g1.1 2 2 -
g1.2 - 3 3
g2.2 4 - -
g2.1 5 - -
g4.1 3 4 -
g5.1 - - 3

实现代码如下:
awk '{a[ARGIND" "$1]=$2 # ARGIND是当前命令行文件的位置(从0开始),将它和第一列的value作为下标,建立数组a。
       b[$1]   #将第一列的value作为下标,建立数组b,目的是在读完所有文件之后,能得到第一列value的uniqe-list。
        }
END{
        for(i in b) {
                printf i" "
                for(j=1;j<=ARGIND;j ) printf "%s ", a[j" "i]?a[j" "i]:"-" #此时的ARGIND值为3.
print ""
                }
        }' file1 file2 file3

这里是利用awk的内置变量ARGIND来处理完成对文件的处理。关于ARGIND,ARGV,ARGC的使用,大家可以参考:http://bbs.chinaunix.net/viewthr ... 0335&from=favorites。
当然,我们也可以利用另外一个内置变量FILENAME来完成相同的任务(大家可以先想想怎么写),如下:
awk '{a[FILENAME" "$1]=$2;b[$1];c[FILENAME]}END{for(i in b) {printf i" ";for(j in c) printf "%s ", a[j" "i]?a[j" "i]:"-";print""}}' file1 file2 file3

<例2>:对上面的数据的格式稍作改动,每个文件的分隔符都一样的情况,但输出要求不变:
cat file1
g1.1|2
g2.2|4
g2.1|5
g4.1|3
cat file2
g1.1#2
g1.2#3
g4.1#4
cat file3
g1.2@3
g5.1@3

实现代码如下:
awk '{a[ARGIND" "$1]=$2
b[$1]
}
END{
for(i in b) {
printf i" "
for(j=2;j<=ARGIND;j =2) printf "%s ", a[j" "i]?a[j" "i]:"-" # 由于FS的设置也是有对应ARGIND值,所以对ARGIND稍作改动。
print ""
}
}' FS="|" file1 FS="#" file2 FS="@" file3 # 对每个文件分别设置FS的值。

因为这个例子的数据比较简单,我们也可以在BEGIN模块中完成对FS值设置,如下:
awk 'BEGIN{FS="[|#@]"}{a[ARGIND" "$1]=$2; b[$1]}END{for(i in b) {printf i" ";for(j=1;j<=ARGIND;j ) printf "%s ", a[j" "i]?a[j" "i]:"-"; print ""}}' file1 file2 file3

利用FILENAME 同样可以解决问题:
awk '
FILENAME=="file1"{FS="|"}    # 设置FS
FILENAME=="file2"{FS="#"}   #设置FS
FILENAME=="file3"{FS="@"}  #设置FS
# 稍显繁琐,不过一目了然
{$0=$0}                                   #使FS生效。
{a[ARGIND" "$1]=$2; b[$1]}
END{ for(i in b) {printf i" "; for(j=1;j<=ARGIND;j ) printf "%s ", a[j" "i]?a[j" "i]:"-"; print ""}
}' file1 file2 file3

推荐一个关于数组处理文件的帖子http://www.chinaunix.net/jh/24/577044.html ,里面有不少例子供大家学习。

7.  文本翻转或移位:二维或多维数组的应用
<例1>:
Inputfile
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
Outputfile
4 3 2 1
5 4 3 2
6 5 4 3
1 6 5 4
2 1 6 5
3 2 1 6

awk '{
     if (max_nf < NF)
          max_nf = NF # 数组第一维的长度
     max_nr = NR      # 数组第二维的长度
     for (x = 1; x <= NF; x )
          vector[x, NR] = $x #建立数组vector
}
END {
     for (x = 1; x <= max_nf; x ) {
          for (y = max_nr; y >= 1; --y)
               printf("%s ", vector[x, y])
          printf("\n")
     }
}'

<例2>:来自http://bbs.chinaunix.net/viewthr ... &page=1#pid13339226
有两个文本a和b,要求输出c文本,合并的规则是按照第一行的headline(按字母顺序)合并文本a和b,空缺按“0”补齐。
cat a.txt
a b c d
1 2 9 7
4 5 8 9
5 3 6 1
cat b.txt
a e f d g
9 2 4 7 3
4 3 7 9 4
cat c.txt
a b c d e f g
1 2 9 7 0 0 0
4 5 8 9 0 0 0
5 3 6 1 0 0 0
9 0 0 7 2 4 3
4 0 0 9 3 7 4

下面我们来参看并解读下Tim大师的代码:
awk '
FNR==1{    #FNR==1,即a和b文本的第一行,这个用的真的很巧妙。
        for(i=1;i<=NF;i ){
                b[i]=$i    #读取文本的每个元素存入数组b
                c[$i] }  #另建立数组c,并统计每个元素的个数
                next          #可以理解为,读取FNR!=1的文本内容。
        }
{k                                      # 统计除去第一行的文本行数
for(i=1;i<=NF;i )a[k","b[i]]=$i  #利用一个二维数组来保持每个数字的位置, k,b[i]可以理解为每个数字的坐标。
}
END{
        l=asorti(c)          #利用asorti函数对数组的下标进行排序,并获取数组长度,即输出文件的列数(NF值)
        for(i=1;i<=l;i )printf c[i]" " # 先打印第一行,相当于headline。
        print ""
        for(i=1;i<=k;i ){
                for(j=1;j<=l;j )printf a[i","c[j]]?a[i","c[j]]" ":"0 " # 打印二维数组的值。
                print ""}
        }' a.txt b.txt

8.  选择性打印:
打印某个关键字前几行,以3行为例:
seq 20 |awk '/\<10\>/{for(i=NR-3;i
7
8
9

利用NR取余数,建立数组,这是一种非常高效的代码。

9. 通过split函数建立数组:数组的下标为从1开始的数字。
split(s, a [, r]) # s:string, a:array name,[,r]:regular expression。
echo 'abcd' |awk '{len=split($0,a,"");for(i=1;i<=len;i ) print "a["i"] = " a[i];print "length = " len}'
a[1] = a
a[2] = b
a[3] = c
a[4] = d
length = 4

10. awk数组使用的小技巧和需要避免的用法:

<1> 嵌套数组:
awk 'BEGIN{a[1]=3;b[1]=1;print a[b[1]]}'
3

<2> 下标设为变量或函数:
awk 'BEGIN{s=123;a[substr(s,2)]=substr(s,1,1);for(i in a)print "index : "i"\nvalue : "a[i]}'
index : 23
value : 1

<3> 不可以将数组名作为变量使用,否则会报错:
awk 'BEGIN{a["1"] = 3; delete a;a=3;print a}'  #即使你已经使用了delete函数。
awk: fatal: attempt to use array `a' in a scalar context

<4> 数组的长度:
length(array) 

<5> match 函数也可以建立数组(你知道么?,版本要求高于gawk 3.1.2)
echo "foooobazbarrrrr |
gawk '{ match($0, /(fo ). (bar*)/, arr)  #匹配到的部分自动赋值到arr中,下标从1开始
          print arr[1], arr[2]
          print arr[1, "start"], arr[1, "length"]  #二维数组arr[index,"start"]值=RSTART
          print arr[2, "start"], arr[2, "length"]  #二维数组arr[index,"length"]值=RLENGTH
          }'
foooo barrrrr
1 5
9 7

<6>想到过用split清空数组么?
awk 'BEGIN{
split("abc",array,"")
print "array[1] = "array[1],"\narray[2] = "array[2],"\narray[3] = "array[3]
split("",array)
print "array[1] = "array[1],"\narray[2] ="array[2],"\narray[3] ="array[3]
}'
array[1] = a
array[2] = b
array[3] = c
array[1] =
array[2] =
array[3] =


介绍下几个awk数组相关的知识点:

<1>建立数组
array[index] = value :数组名array,下标index以及相应的值value。

<2>读取数组值
{ for (item in array)  print array[item]} # 输出的顺序是随机的
{for(i=1;i<=len;i )  print array[i]} # Len 是数组的长度

<3>多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符,默认为“\034”。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如:
awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'
a:b
awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
a:b

但,有些特殊情况需要避免,如:
awk 'BEGIN{
SUBSEP=":"
array["a","b:c"]=1               # 下标为“a:b:c”
array["a:b","c"]=2               #下标同样是“a:b:c”
for (i in array) print i,array[i]}'
a:b:c 2                                 #所以数组元素只有一个。

<4>删除数组或数组元素: 使用delete 函数
delete array                     #删除整个数组
delete array[item]           # 删除某个数组元素(item)

<5> 排序:awk中的asort函数可以实现对数组的值进行排序,不过排序之后的数组下标改为从1到数组的长度。在gawk 3.1.2以后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)以后,仍 会用数字(1到数组长度)来作为下标,但是array的数组值变为排序后的原来的下标,除非你指定另一个参数如:asorti(a,b)。(非常感谢 lionfun对asorti的指正和补充)

echo 'aa
bb
aa
bb
cc' |\
awk '{a[$0] }END{l=asorti(a);for(i=1;i<=l;i )print a[i]}'
aa
bb
cc

echo 'aa
bb
aa
bb
cc' |\
awk '{a[$0] }END{l=asorti(a,b);for(i=1;i<=l;i )print b[i],a[b[i]]}'
aa 2
bb 2
cc 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu环境下如何安装jdk,安装eclipse,安装android studio总结

1 安装jdk总结: 先下载ubuntu的jdk,然后解压,放入文件夹,然后在profile里面配置,关键命令如下 sudo gedit /etc/profile 然后加入以下配置 export JAVA_HOME=/usr/local/java/jdk1.6.0_30 export JRE_HOME=/usr/local/java/jdk1.6.0_30/jre export CLASSPATH=.:$JAVA_HOM…

MegaCli 监控Raid状态

MegaCli是一款管理维护硬件RAID软件&#xff0c;可以通过它来了解当前 raid卡的所有信息&#xff0c;包括 raid卡的型号&#xff0c;raid的阵列类型&#xff0c;raid 上各磁盘状态&#xff0c;等等。通常&#xff0c;我们对硬盘当前的状态不太好确定&#xff0c;一般通过机房人…

巧用ActionFilter的AOP特性,为返回的数据增加返回码和消息

背景对于处理接口返回值统一加密&#xff0c;过滤&#xff0c;特定值统一处理&#xff0c;统一返回等多种需求&#xff0c;net的拦截器前置拦截比较常用&#xff0c;例如&#xff1a;登录校验&#xff0c;参数格式校验等等。接下来介绍filter。filter过滤器实现filter的ActionF…

研究表明,胸大无脑是不存在的......

1 求车主心里阴影面积▼2 不管成不成功大叔是你坚实的后盾▼3 小岳岳的“全球分鹏”▼4 胸大无脑是不存在的&#xff01;▼美国芝加哥大学曾对1200名女性进行实验&#xff0c;胸部丰满女性在智商测试中的平均得分反而比胸部扁平的女性高出了10分。5 你也是个逻辑鬼才▼6 想…

每日一小练——按字典顺序列出全部子集

上得厅堂&#xff0c;下得厨房&#xff0c;写得代码&#xff0c;翻得围墙&#xff0c;欢迎来到睿不可挡的每日一小练&#xff01; 题目&#xff1a;按字典顺序列出全部子集 内容&#xff1a; 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来。 解答&#xff…

CSS 特殊性、继承与层叠

一、特殊性规则 选择器的特殊性由选择器本身的组件确定&#xff1b;特殊性由四个部分组成&#xff0c;其初始值为0&#xff0c;0&#xff0c;0&#xff0c;0。 1. 对于选择器中的每一个id&#xff0c;记0&#xff0c;1&#xff0c;0&#xff0c;0&#xff1b; 2. 对于选择…

Android 之6.0 双向通话自动录音

可以先参考下这篇博客&#xff0c;讲得比较详细 http://www.jizhuomi.com/android/example/354.html 然后我看到这篇博客很叼&#xff0c;其它的文章质量也非常不错&#xff0c;http://blog.csdn.net/gyhgx/article/details/51669892 项目中需要实现基于Android 6.0 的双向通…

void 类型的指针

void指针是空类型的指针&#xff0c;也称为无类型的指针&#xff0c;它不指向任何类型&#xff0c;即它仅仅是个地址。因此void指针不能进行指针运算&#xff0c;也不能取其所指向的数据的值 只有将void指针跟其他类型的指针相关联&#xff0c;才能使用他&#xff0c;可以将其他…

sas数据导入终极汇总-之二

从FTP读入数据read raw data via FTP in SAS?SAS has the ability to read raw data directly from FTP servers. Normally, you would use FTP to download the data to your local computer and then use SAS to read the data stored on your local computer. SAS allows y…

解读WPF中的Xaml

1.Overview这篇文章主要分享从源代码角度解读wpf中xaml。由于源码查看起来错综复杂“随便找一个对象按下F12就是一个新的世界”&#xff0c;看源码的感觉就是在盗梦空间里来回穿梭&#xff1b;所以也是耗费很长的时间去阅读源码然后根据自己的理解编写文章和贴出部分关键源码。…

用心疗眼

训练眼睛的核心绝招——用心&#xff01;——致所有要求具体方法的网友不断有人找我&#xff0c;说自己多少度近视&#xff0c;该如何去训练。针对这样的问题&#xff0c;我总不知如何来回答&#xff0c;因为不同的人应该用不同的训练方法&#xff0c;我所提出的&#xff0c;只…

ubuntu之Unable to lock the administration directory(/var/lib/dpkg/), are you root?13 Permission denie

apt-get install subversion E: 无法打开锁文件 /var/lib/dpkg/lock - open (13 Permission denied) E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?Permission denied 出现这个提示就说明你没有足够的权力去读写这个文件夹的内容,你需要取…

.NET 也有 Husky 了

熟悉前端开发的同学应该知道&#xff0c;前端工程化工作流中有一个很常用的工具&#xff1a;Husky。Husky 方便我们在项目中添加 git hooks&#xff0c;比如配合 lint-staged 在代码提交前进行自动检查编码规范&#xff0c;再比如配合 commitlint 对提交时填写的 message 内容进…

POJ3751 时间日期格式转换【日期计算】

时间日期格式转换Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8306 Accepted: 3829Description 世界各地有多种格式来表示日期和时间。对于日期的常用格式&#xff0c;在中国常采用格式的是“年年年年/月月/日日”或写为英语缩略表示的”yyyy/mm/dd”&#xff…

sas数据导入终极汇总-之一

将数据文件读入SAS ——DATA Step / PROC IMPORT1.将SAS文件读入SAS——data sasuser.saslin;set "F:\sas1.sas7bdat";run;proc contents datasasuser.saslin;run;2.将其他形式文件导入成SAS ——PROC IMPORT / 直接读入其他形式文件proc import datafile "c:\…

寒门博士分享读博经历成“抖音网红”惹争议,博士该这么“不正经”吗?

全世界只有3.14 % 的人关注了爆炸吧知识最近在抖音上&#xff0c;一个名叫“相宜”的主播火了。短短几个月时间内&#xff0c;她就涨粉940万。而和一般网红不同的是&#xff0c;相宜是一位刚毕业的博士。带火她的视频&#xff0c;是她自述博士毕业后的感想&#xff0c;目前已经…

event.x,event.clientX,event.offsetX区别

x:设置或者是得到鼠标相对于目标事件的父元素的外边界在x坐标上的位置。 clientX:相对于客户区域的x坐标位置&#xff0c;不包括滚动条&#xff0c;就是正文区域。 offsetx&#xff1a;设置或者是得到鼠标相对于目标事件的父元素的内边界在x坐标上的位置。 screenX:相对于用户屏…

.bash_profile和.bashrc说明

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:  为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. ~/.bash_profile: 每个用户都可使用…

Android Nine-patch

做了好多客户端软件了&#xff0c;突然发现里面有好多图片都是重复的&#xff0c;个别只是大小不一样&#xff0c;每次都使用大量图片&#xff0c;导致软件过大&#xff0c;项目总结的时候才发现Android已经提供了一种解决方案了&#xff0c;这就是NinePatchDrawable&#xff0…