【awk】数组排序

LeonTown 2011-08-03 02:50:25
该awk应用的需求是:

awk脚本文件的输入是一个文件路径,
遍历该文件的各行,提取出信息,记录在一个数组里。

该信息可以认为是一个key-value的形式,
然后,根据key进行排序,
最后将排好序的数组输出。

请问这样的awk脚本该如何写呢?
主要是key-value数组的存储,和排序,及按序输出。

谢谢!!
...全文
305 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeonTown 2011-08-04
  • 打赏
  • 举报
回复
再就是,增加该行的x的数量这个字段,
因为,x的数量肯呢个很多,用眼数不过来。。。

[Quote=引用 11 楼 leontown 的回复:]

cnt=0;这一句不可以放在BEGIN段里吗?

不是说,awk脚本只是对一行进行处理吗?
放在BEGIN段里应该不会有影响吧?

另外,为什么要用asorti啊?


再就是,能不能给数组的内容再增加一些字段,比如当前文件名等?
[/Quote]
LeonTown 2011-08-04
  • 打赏
  • 举报
回复
cnt=0;这一句不可以放在BEGIN段里吗?

不是说,awk脚本只是对一行进行处理吗?
放在BEGIN段里应该不会有影响吧?

另外,为什么要用asorti啊?


再就是,能不能给数组的内容再增加一些字段,比如当前文件名等?
delphiwcdj 2011-08-04
  • 打赏
  • 举报
回复



# test.awk

BEGIN{
#myarray[-1]=ARGV[1];# awk -f test.awk data
#print myarray[-1]; # print data
}
{
cnt=0;
for(i=0; i<NF; ++i){
# debug
# printf("%c ",$(i+1));
if($(i+1)=="x"){
++cnt;
}
}
#printf("\n");
myarray[cnt]=$0;
}
END{
n=asorti(myarray, dest);# asorti(gawk3.1.2)
for(i=1; i<=n; ++i){
print myarray[dest[i]]; #print value of array
}
#for(i=0; i<=NF; ++i){
# if(myarray[i]){
# print myarray[i];
# }
#}
}

delphiwcdj 2011-08-03
  • 打赏
  • 举报
回复
修改下

# test.awk

#BEGIN{
# myarray[-1]=ARGV[1];# awk -f test.awk data
# print myarray[-1]; # print data
#}
{
cnt=0;
for(i=0; i<NF; ++i){
# debug
# printf("%c ",$(i+1));
if($(i+1)=="x"){
++cnt;
}
}
#printf("\n");
myarray[cnt]=$0;
}
END{
#n=asorti(myarray);# asorti(gawk3.1.2)
#for(i=1; i<=n; ++i){
# print myarray[i]; #print value of array
#}
for(i=0; i<=NF; ++i){
if(myarray[i]){
print myarray[i];
}
}
}

测试:data.txt
a b x c d
b x c x x
c x x d v

awk -f test.awk data

输出:
a b x c d
c x x d v
b x c x x
LeonTown 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 delphiwcdj 的回复:]

gawk -f test.awk data

data文件:
a b x c d
x a c x x
c x x d v
输出:
a b x c d
c x x d v
x a c x x
Perl code

# test.awk
BEGIN{
cnt=0;
}
{
for(i=0; i<NF; ++i){
# printf("%c ",$(……
[/Quote]

非常感谢!

有没有可能给数组增加一个当前文件名(data)的字段呢?
delphiwcdj 2011-08-03
  • 打赏
  • 举报
回复
gawk -f test.awk data

data文件:
a b x c d
x a c x x
c x x d v
输出:
a b x c d
c x x d v
x a c x x

# test.awk
BEGIN{
cnt=0;
}
{
for(i=0; i<NF; ++i){
# printf("%c ",$(i+1));
if($(i+1)=="x"){
++cnt;
}
}
#printf("\n");
myarray[$cnt]=$0;
}
END{
n=asort(myarray);
for(i=1; i<=n; ++i){
print myarray[i];
}
}

LeonTown 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 joan8363 的回复:]

key是当前行中"x"的数量,value记录行号等信息。

key是x的数量?这样key不就不唯一了?
[/Quote]

哦,这个数组不能认为就是个map,
这里的key仅供排序之用。

或许,数组存储的是一个struct,其中有x的数量、行号等信息,
并且,根据x的数量排序。
joan8363 2011-08-03
  • 打赏
  • 举报
回复
key是当前行中"x"的数量,value记录行号等信息。

key是x的数量?这样key不就不唯一了?
LeonTown 2011-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 joan8363 的回复:]

awk -F'x' '{print NF-1,$0}' | sort -n
[/Quote]

这是个很有趣的技巧!
不过,我更希望通过遍历字段,将结果备份到数组里,
还要记录当前的行号,文件名等信息。

类似于:
for (x=1; x<=NF; x++) {
if($x == "x")
num_null = num_null + 1
}


主要是,这里的数组该如何表示呢?
key是当前行中"x"的数量,value记录行号等信息。
并且按照key对数组进行排序。
joan8363 2011-08-03
  • 打赏
  • 举报
回复
awk -F'x' '{print NF-1,$0}' | sort -n
LeonTown 2011-08-03
  • 打赏
  • 举报
回复
比如说,文件格式如下:
a b x c d
x a c d a
c x x d v
...

每行有5个字段,统计每行出现x的次数,
并根据x的数量从小到大重拍各行。
joan8363 2011-08-03
  • 打赏
  • 举报
回复
搞个例子出来比较好
awk '{a[$1]=$2}END{l=asorti(a,b);for(i=1;i<=l;i++)print b[i],a[b[i]]}'
第一部分 编 程 技 术 第1章 性能监视工具 3 1.1 计算素数 3 1.2 使用性能监视工具 7 1.3 一个专用的性能监视工具 8 1.4 开发性能监视工具 10 1.5 原理 11 1.6 习题 11 1.7 深入阅读 12 第2章 关联数组 13 2.1 Awk中的关联数组 13 2.2 有穷状态机模拟器 16 2.3 拓扑排序 17 2.4 原理 20 2.5 习题 21 2.6 深入阅读 22 第3章 程序员的忏悔 23 3.1 二分搜索 24 3.2 选择算法 26 3.3 子程序库 28 3.4 原理 30 3.5 习题 31 第4章 自描述数据 33 4.1 名字—值对 33 4.2 记录来历 36 4.3 排序实验 37 4.4 原理 39 4.5 习题 39 第二部分 实 用 技 巧 第5章 劈开戈尔迪之结 43 5.1 小测验 43 5.2 解答 44 5.3 提示 44 5.4 原理 47 5.5 习题 48 5.6 深入阅读 49 5.7 调试(边栏) 49 第6章 计算机科学箴言集 51 6.1 编码 52 6.2 用户界面 53 6.3 调试 53 6.4 性能 54 6.5 文档 56 6.6 软件管理 56 6.7 其他 58 6.8 原理 58 6.9 习题 58 6.10 深入阅读 60 第7章 粗略估算 61 7.1 头脑热身 61 7.2 性能的经验法则 62 7.3 Little定律 64 7.4 原理 65 7.5 习题 66 7.6 深入阅读 67 7.7 日常速算(边栏) 67 第8章 人员备忘录 69 8.1 备忘录 69 8.2 原理 71 8.3 深入阅读 71 第三部分 人性化I/O 第9章 小语言 75 9.1 Pic语言 76 9.2 视角 79 9.3 Pic预处理器 81 9.4 用来实现Pic的小语言 83 9.5 原理 87 9.6 习题 88 9.7 深入阅读 89 第10章 文档设计 91 10.1 表格 92 10.2 三条设计原则 94 10.3 插图 94 10.4 文本 96 10.5 合适的媒介 98 10.6 原理 100 10.7 习题 101 10.8 深入阅读 101 10.9 次要问题目录(边栏) 101 第11章 图形化输出 103 11.1 实例研究 103 11.2 显示结果取样 105 11.3 原理 107 11.4 习题 108 11.5 深入阅读 110 11.6 拿破仑远征莫斯科(边栏) 110 第12章 对调查的研究 113 12.1 有关民意调查的问题 113 12.2 语言 114 12.3 图片 117 12.4 原理 119 12.5 习题 120 第四部分 算 法 第13章 绝妙的取样 123 13.1 取样算法一瞥 123 13.2 Floyd算法 124 13.3 随机排列 125 13.4 原理 127 13.5 习题 127 13.6 深入阅读 128 第14章 编写数值计算程序 129 14.1 问题 129 14.2 牛顿迭代 130 14.3 良好的起点 132 14.4 代码 133 14.5 原理 135 14.6 习题 135 14.7 深入阅读 137 14.8 数值算法的力量(边栏) 137 第15章 选择 141 15.1 问题 141 15.2 程序 142 15.3 运行时间分析 145 15.4 原理 148 15.5 习题 149 15.6 深入阅读 151 附录A C和Awk语言 153 附录B 一个子程序库 157 部分习题答案 165 索引 181
目 录 译者序 前言 第1章 风格 1 1.1 名字 2 1.2 表达式和语句 4 1.3 一致性和习惯用法 8 1.4 函数宏 14 1.5 神秘的数 15 1.6 注释 18 1.7 为何对此费心 22 第2章 算法与数据结构 23 2.1 检索 23 2.2 排序 25 2.3 库 27 2.4 一个Java快速排序 29 2.5 大O记法 31 2.6 可增长数组 33 2.7 表 35 2.8 树 39 2.9 散列表 43 2.10 小结 46 第3章 设计与实现 48 3.1 马尔可夫链算法 48 3.2 数据结构的选择 50 3.3 在C中构造数据结构 51 3.4 生成输出 54 3.5 Java 56 3.6 C++ 59 3.7 Awk和Perl 61 3.8 性能 63 3.9 经验教训 64 第4章 界面 67 4.1 逗号分隔的值 67 4.2 一个原型库 69 4.3 为别人用的库 72 4.4 C++实现 79 4.5 界面原则 82 4.6 资源管理 84 4.7 终止、重试或失败 86 4.8 用户界面 90 第5章 排错 93 5.1 排错系统 94 5.2 好线索,简单错误 95 5.3 无线索,难办的错误 98 5.4 最后的手段 101 5.5 不可重现的错误 103 5.6 排错工具 105 5.7 其他人的程序错误 107 5.8 小结 108 第6章 测试 110 6.1 在编码过程中测试 110 6.2 系统化测试 114 6.3 测试自动化 118 6.4 测试台 120 6.5 应力测试 123 6.6 测试秘诀 125 6.7 谁来测试 126 6.8 测试马尔可夫程序 127 6.9 小结 129 第7章 性能 130 7.1 瓶颈 130 7.2 计时和轮廓 135 7.3 加速策略 138 7.4 代码调整 140 7.5 空间效率 144 7.6 估计 145 7.7 小结 147 第8章 可移植性 149 8.1 语言 149 8.2 头文件和库 154 8.3 程序组织 156 8.4 隔离 159 8.5 数据交换 160 8.6 字节序 161 8.7 可移植性和升级 164 8.8 国际化 165 8.9 小结 167 第9章 记法 169 9.1 数据格式 169 9.2 正则表达式 174 9.3 可编程工具 180 9.4 解释器、编译器和虚拟机 182 9.5 写程序的程序 186 9.6 用宏生成代码 189 9.7 运行中编译 190 后记 195 附录:规则汇编 197 索引 200

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧