处理一块显卡, 有谁要的 财女嫁到 相公开个价价撒,

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
awk数组不知下标,输出数组中的一个值
示例文件如下:其中第二列的值并非是直接得到的,而是通过多行的计算才得到的,这里为了方便才这么写
awk '{array[$1]=$2}END{如何输出array中的一个元素的值,这个值可以是第一个值或最后一个值也可以是任意一个值}'
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
补充第一列也是不确定的,我并不知道他具体是什么值,但是我需要用它作为数组的下标
富足长乐, 积分 6046, 距离下一级还需 1954 积分
论坛徽章:49
awk '{array[$1]=$2}END{ for (i in array) print array[i]}'
腰缠万贯, 积分 9028, 距离下一级还需 972 积分
论坛徽章:52
for(i in array){split(i, newarray,SUBSEP); print newarray[3]} ?
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
我只要输出一个值就可以了,并不需要输出所有值,所有有没有更简便的方法
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
本帖最后由 oppo0114 于
11:11 编辑
awk '{array[$1]=$2}END{ for (i in array) {print array;break}}'
目前是这么做的,但是为了取一个值用for循环,又break感觉很搓
富足长乐, 积分 6046, 距离下一级还需 1954 积分
论坛徽章:49
& & 你干嘛要用数组? 你的需求到底是啥
富足长乐, 积分 7443, 距离下一级还需 557 积分
论坛徽章:5
lol目测又是xy的问题
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
本帖最后由 oppo0114 于
11:46 编辑
1、我先要逐行分析,并生成对应的一个数组;
然后已a,b...为下标,多行xxx计算的值为值
2、然后对这个数组有多个用途,其中一个为计算最大最小值;for(i in array){min=max=array[i];break} #目前觉得这一步台搓了
for(i in array){min=(min&array[i]?min:array[i]);max=(max&array[i]?max:array[i]);}复制代码
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
也可以这么说,具体的参见回复7楼的2141人阅读
shell编程(29)
由于awk数组,是关联数组。for…in循环输出时候,默认打印出来是无序数组。
[chengmo@localhost ~]$ awk 'BEGIN{info = &this is a test&;split(info,tA,& &);for(k in tA){print k,tA[k];}}'
如果需要按照顺序输出,通过键值定位方式输出。
[chengmo@localhost ~]$ awk 'BEGIN{info = &this is a test&;slen=split(info,tA,& &);for(i=1;i&=i++){print i,tA[i];}}'
一、通过内置函数(asort,asorti使用) awk 3.1以上版本才支持
1.asort使用说明
srcarrlen=asort[srcarr,dscarr] 默认返回值是:原数组长度,传入参数dscarr则将排序后数组赋值给dscarr.
[chengmo@localhost ~]$ awk 'BEGIN{
a[100]=100;
slen=asort(a,tA);
for(i=1;i&=i++)
{print i,tA[i];}
asort只对值进行了排序,因此丢掉原先键值。
2、asorti 使用说明
[chengmo@localhost ~]$ awk 'BEGIN{
a[&d&]=100;
a[&a&]=224;
a[&c&]=34;
slen=asorti(a,tA);
for(i=1;i&=i++)
{print i,tA[i],a[tA[i]];}
asorti对键值 进行排序(字符串类型),将生成新的数组放入:tA中。
二、通过管道发送到sort排序
[chengmo@localhost ~]$awk 'BEGIN{
a[100]=100;
for(i in a)
{print i,a[i] | &sort -r -n -k2&;}
通过管道,发送到外部程序“sort”排序,-r 从大到小,-n 按照数字排序,-k2 以第2列排序。通过将数据丢给第3方的sort命令,所有问题变得非常简单。如果以key值排序 –k2 变成 -k1即可。
[chengmo@localhost ~]$ awk 'BEGIN{
a[100]=100;
for(i in a)
{print i,a[i] | &sort -r -n -k1&;}
三、自定义排序函数
awk自定义函数结构:
function funname(p1,p2,p3)
以上是:awk自定义函数表示方式,默认传入参数都是以引用方式传入,return值,只能是字符型或者数值型。 不能返回数组类型。 如果返回数组类型。需要通过形参 方式传入。再获得。
awk返回数组类型
awk 'function test(ary){
for(i=0;i&10;i++){
n=test(array);
for(i=0;i&n;i++){
print array[i];
#arr 传入一维数组
#key 排序类型 1是按照值排序 2按照键值
#datatype 比较类型 1按照数字排序 2按照字符串排序
#tarr 排序返回的数组
#splitseq 分割字符串 数组中键与值之间分割字符串
#return 数组长度
#实现思路,将原始数组a['a']=100 排序后变成 a[1]=a分隔符100 ,然后按照下标递归显示内容。 本排序使用冒泡方式进行。
function sortArr(arr,key,datatype,tarr,splitseq)
if(key ~ /[^1-2]/)
for(k in arr)
tarr[++alen]=(k&&splitseq&&arr[k]);
for(m=1;m&=m++)
for(n=1;n&=alen-m-1;n++)
split(tarr[m],tm,splitseq);
split(tarr[n+1],tn,splitseq);
tnum=tarr[m];
if(datatype==1)
if(tm[key]+0&tn[key]+0)
tarr[m]=tarr[n+1];
tarr[n+1]=
if((tm[key]&&) & (tn[key]&&))
tarr[m]=tarr[n+1];
tarr[n+1]=
完整代码如下:
[chengmo@centos5 ~]$ awk 'BEGIN{
a[&a&]=100;
a[&b&]=110;
a[&c&]=10;
splitseq=&%%&;
alen=sortArr(a,2,1,tarr,splitseq);
for(m=1;m&=m++)
split(tarr[m],ta,splitseq);
print m,ta[1],ta[2];
function sortArr(arr,key,datatype,tarr,splitseq)
if(key ~ /[^1-2]/)
for(k in arr)
tarr[++alen]=(k&&splitseq&&arr[k]);
for(m=1;m&=m++)
for(n=1;n&=alen-m-1;n++)
split(tarr[m],tm,splitseq);
split(tarr[n+1],tn,splitseq);
tnum=tarr[m];
if(datatype==1)
if(tm[key]+0&tn[key]+0)
tarr[m]=tarr[n+1];
tarr[n+1]=
if((tm[key]&&) & (tn[key]&&))
tarr[m]=tarr[n+1];
tarr[n+1]=
以上是awk数组排序一些方法。对于少量数据排序,就性能而言,使用自定义函数性能要高,不需要另外再开启进程。对于大量数据,排序第2种方法还是很不错的。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1809785次
积分:19681
积分:19681
排名:第365名
原创:469篇
转载:156篇
评论:162条
阅读:32042
文章:10篇
阅读:13167
(2)(2)(1)(6)(1)(1)(1)(1)(1)(4)(2)(4)(10)(2)(8)(6)(5)(5)(2)(2)(10)(4)(13)(36)(20)(4)(7)(9)(14)(3)(29)(36)(38)(5)(10)(5)(33)(69)(5)(21)(71)(29)(20)(38)(11)(20)转自ChinaUnix论坛,感谢作者整理。
在文本处理的工作中,awk的数组是必不可少的工具,在这里,同样以总结经验和教训的方式和大家分享下我的一些学习心得,如有错误的地方,请大家指正和补充。awk的数组,一种关联数组(Associative Arrays),下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。首先介绍下几个awk数组相关的知识点:&1&建立数组
array[index] = value :数组名array,下标index以及相应的值value。
&2&读取数组值
{ for (item in array)&&print array[item]} # 输出的顺序是随机的
{for(i=1;i&=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}'
awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
但,有些特殊情况需要避免,如:
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的指正和补充)
awk '{a[$0]++}END{l=asorti(a);for(i=1;i&=l;i++)print a[i]}'
awk '{a[$0]++}END{l=asorti(a,b);for(i=1;i&=l;i++)print b[i],a[b[i]]}'
下面说awk数组的实际应用。1.&&除去重复项, 这个不多说, 只给出代码:
awk '!a[$0]++' file(s)& && && && && && &&
awk '!($0 in a){a[$0];print}' file(s)& &
另一种:&2. 计算总数(sum),如:
awk&&'{name[$0]+=$1};END{for(i in name) print&&i, name[i]}'
再举个例子:
echo "aaa 1
ccc 1" |awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}'
3. 查看文件差异。
&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
&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
另:&4.&&排序:
awk '{a[$0]=$0} #建立数组a,下标为$0,赋值也为$0
len=asort(a)& && &#利用asort函数对数组a的值排序,同时获得数组长度len
for(i=1;i&=i++) print i "\t"a[i]&&#打印
5& && & 10
6& && & 100
5.&&有序输出:采用(index in array)的方式打印数组值的顺序是随机的,如果要按原序输出,则可以使用下面的方法:
awk '{a[$1]=$2
c[j++]=$1}
for(m=0;m&j;m++)print c[m],a[c[m]]
6.&&多个文本编辑:这里主要指的是待处理的文本之间的格式上有区别,如分隔符不同,;或是待处理文本需提取的信息的位置不同,如不同的列或行。&例1&:
要求输出:
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。
& && &&&for(i in b) {&
& && && && && & printf i" "&
& && && && && & for(j=1;j&=ARGIND;j++) printf "%s ", a[j" "i]?a[j" "i]:"-" #此时的ARGIND值为3.
& && && && && & }
& && &&&}' file1 file2 file3
这里是利用awk的内置变量ARGIND来处理完成对文件的处理。关于ARGIND,ARGV,ARGC的使用,大家可以参考:。当然,我们也可以利用另外一个内置变量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&:对上面的数据的格式稍作改动,每个文件的分隔符都一样的情况,但输出要求不变:
实现代码如下:
awk '{a[ARGIND" "$1]=$2
for(i in b) {
printf i" "
for(j=2;j&=ARGIND;j+=2) printf "%s ", a[j" "i]?a[j" "i]:"-" # 由于FS的设置也是有对应ARGIND值,所以对ARGIND稍作改动。
}' 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 同样可以解决问题:
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
推荐一个关于数组处理文件的帖子&,里面有不少例子供大家学习。7.&&文本翻转或移位:二维或多维数组的应用&例1&:
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
& &&&if (max_nf & NF)
& && && & max_nf = NF # 数组第一维的长度
& &&&max_nr = NR& && &# 数组第二维的长度
& &&&for (x = 1; x &= NF; x++)
& && && & vector[x, NR] = $x #建立数组vector
& &&&for (x = 1; x &= max_ x++) {
& && && & for (y = max_ y &= 1; --y)
& && && && && &printf("%s ", vector[x, y])
& && && & printf("\n")
&例2&:来自有两个文本a和b,要求输出c文本,合并的规则是按照第一行的headline(按字母顺序)合并文本a和b,空缺按&0&补齐。
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大师的代码:
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]可以理解为每个数字的坐标。
& && &&&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&NR;i++)print a[i%3];exit}{a[NR%3]=$0}'
利用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&=i++) print "a["i"] = " a[i];print "length = " len}'
length = 4
10. awk数组使用的小技巧和需要避免的用法:&1& 嵌套数组:
awk 'BEGIN{a[1]=3;b[1]=1;print a[b[1]]}'
&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
&3& 不可以将数组名作为变量使用,否则会报错:
awk 'BEGIN{a["1"] = 3;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
&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] =
阅读(...) 评论()

我要回帖

更多关于 处理器和显卡哪个重要 的文章

 

随机推荐