使用字段的值作为数组下标

对于awk命令,任何表达式都可以用作数组的下标。所以,也可以用字段作下标。下面的例子中的程序用于计算所有名字在第2 个字段出现的次数,并引入了一种for循环的新形式。

for(index_value in array) statement

在前面介绍的例子中,END块中出现的for循环的工作过程如下:变量name被设为count数组的索引值,在每次for循环的迭代中,执行print操作,首先打印的是索引值,然后是保存在元素中的值(打印输出的次序无法确定)。

范例

$ cat datafile4

4234 Tom 43

4567 Arch 45

2008 Eliza 65

4571 Tom 22

3298 Eliza 21

4622 Tom 53

2345 Mary 24

$ awk ‘{count[$2]++}END{for(name in count)print name,count[name]}‘

Tom 3

Arch 1

Eliza 2

Mary 1

说明:这条awk语句首先用记录的第2个字段作为数组count的下标。数组的下标随第2个字段的变化而变化,所以数组count 的第一个下标是Tom。而count["Tom"]中保存的值是1。然后,count["Arch"]、count["Eliza"]和count["Mary"]相继被设为10当在第2个字段中再次出现Tom时,count["Tom"]的值将被加1,于是它目前的值是2。Arch、Eliza和Mary再次出现时其过程类似。

范例

$ awk ‘{dup[$2]++; if(dup[$2] > 1){name[$2]++}}\

END{print "The duplicates were"\

for(i in name){print i,name[i]}}‘ datafile4

Tom 2

Eliza 2

说明:数组dup的下标是第2个字段的值,即人名。dup数组中元素的值最初都是0,每处理一条记录,相应元素的值就加1。如果名字重复出现,则对应该下标的元素值就会变成2,并相应地逐渐增加。如果dup数组中某个元素的值大于1,就会创建一个名为name的新数组,也是以第2个字段的值作为下标,用于记录出现次数大于1的人名。

参考资料:http://www.linuxawk.com/jiaocheng/274.html

时间: 2024-10-12 14:36:56

使用字段的值作为数组下标的相关文章

char值不能直接用作数组下标

#include <stdio.h> //用 char 的值作为数组下标(例如,统计字符串中每个字符出现的次数),要考虑到 //char 可能是负数.有的人考虑到了,先强制转型为 unsigned int 再用作下标,这仍然 //是错的,因为char会先字节扩展变为int,再从int变为unsigned int. //正确的做法是,先强制转型为 unsigned char,再用作下标,这时会再隐式转换为int. int main() { char a = 128; printf("%

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

通过反射得到object[]数组的类型并且的到此类型所有的字段及字段的值

private string T_Account(object[] list) { StringBuilder code = new StringBuilder(); //得到数据类型 Type t = list[0].GetType(); List<string> str = new List<string>(); //得到类型的所有字段 FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic | BindingFlags.

关联数组中根据某个某个字段的值排序

$tempArr = array(); foreach($arr as $key=>$v){ $tempArr[$key]['clue'] = $v['clue'];//所要排序的字段 } //根据字段的值从大到小排序 array_multisort($tempArr,SORT_DESC,$arr); 原文地址:https://www.cnblogs.com/jackzhuo/p/11797773.html

用PHP实现的快速排序算法(支持记录原始数组下标)

代码如下 <?php /** * 快速排序 */ define("MAX_LENGTH_INSERT_SORT", 7); class QuickSort { /** * 交换数组i和j的值 */ function swap(&$data=array(), $i, $j) { $temp = $data[$i]; $data[$i] = $data[$j]; $data[$j] = $temp; } /** * 交换数组data中子表的记录,是枢轴记录到位,并返回其所在位

重载二维数组下标&quot;[][]&quot;

问题来源:(待续) 解决办法: (1) 可变长数组 对于可变的二维数组下标重载,在数组初始化时指定维数,之后可以像一般的二维数组进行赋值和取值操作. 当然,使用模板template来实现更好. 1 class Array2d{ 2 private: 3 int* a; 4 int nrow; 5 int ncol; 6 public: 7 Array2d(const int nrow_, const int ncol_) 8 :nrow(nrow_), ncol(ncol_) 9 { 10 a

jsoncpp封装和解析字符串、数字、布尔值和数组

使用jsoncpp进行字符串.数字.布尔值和数组的封装与解析. 1)下载jsoncpp的代码库 百度网盘地址 :http://pan.baidu.com/s/1ntqQhIT 2)解压缩文件 jsoncpp.rar unzip jsoncpp.rar 3)修改jsoncpp/src/main.cpp文件 vim src/main.cpp 1 #include <string> 2 #include <json/json.h> 3 #include "stdio.h&quo

网易云课堂_C++程序设计入门(下)_第8单元:年年岁岁花相似– 运算符重载_第8单元 - 作业2:OJ编程 - 重载数组下标运算符

第8单元 - 作业2:OJ编程 - 重载数组下标运算符 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 练习数组下标运算符重载 依照学术诚信条款,我保证此作业是本人独立完成的. 1 练习数组下标运算符重载(6分) 本题目具体内容请参见 [第8单元 - 单元作业2说明] 时间限制:500ms内存限制:32000kb #include <iostream> #in

Objective-C如何自己实现一个基于数组下标的属性访问模式

在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定.当你实现了这其中的方法之后即可使用数组下标来访问属性元素 在Foundation库中,NSArray类实现了- (id)objectAtIndexedSubscript:(NSUInteger)idx方法.因此,我们可以这么来访问数组元素: NSArray *arr = @[@100, @200, @300]; NSNumber *num = arr[