Chinaunix
标题:
这个问题谁有更妙更简洁的办法
[打印本页]
作者:
dahaoshanhe
时间:
2012-03-05 10:04
标题:
这个问题谁有更妙更简洁的办法
源文件:
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
复制代码
目的:在源文件中,有2列。输出文件,前2列为原文件内容。第3列为源文件中第2列 经过 随机 排序后的结果。
目标文件:
1 1 4
1 2 5
1 3 6
1 4 7
1 5 8
1 6 9
1 7 10
1 8 11
1 9 12
1 10 13
1 11 14
1 12 1
1 13 15
1 14 2
1 15 16
1 16 3
复制代码
awk '
BEGIN{
}
{
a[$1]=$1;
t[$2]=$2
}
END{
for(i in a)
{
for(j in t )
{ print "\t"a[i] "\t" t[j]; }
}
}' file
paste -d " " file fil | awk '{print $1,$2,$4}'
复制代码
以上是我的做法 好像有点笨,各位还有什么妙招么~~~
作者:
yinyuemi
时间:
2012-03-05 10:04
本帖最后由 yinyuemi 于 2012-03-05 23:36 编辑
回复
1#
dahaoshanhe
sort (GNU coreutils) 8.15
awk 'BEGIN{while("sort -k2,2 -R file"|getline )a[$2]=++i}{print $0,a[$2]}' file
复制代码
正解见10楼zooyo版大的
作者:
zhaopingzi
时间:
2012-03-05 10:06
楼主是钱真多。
作者:
ywlscpl
时间:
2012-03-05 10:40
回复
1#
dahaoshanhe
awk '{a[NR]=$0;b[NR]=$2}END{srand();while (i<NR) {n=int(rand()*NR)+1;if (!c[n]++) {i++;d[i]=b[n]}}for (i=1;i<=NR;i++) print a[i],d[i]}' file
复制代码
作者:
lkk2003rty
时间:
2012-03-05 12:25
awk 'BEGIN{n=0;srand()}FNR==NR{n++;a[NR]=$NF;next}{s=int(n*rand()+1);if(!(s in a))for(i=(s+1)%(n + 1);;i=(i+1)%(n + 1))if(i in a){s=i;break;}print $0,a[s];delete a[s];}' file file
复制代码
作者:
nuclearxin
时间:
2012-03-05 14:02
2列 唯一 是隐藏条件啊
作者:
ywlscpl
时间:
2012-03-05 14:14
本帖最后由 ywlscpl 于 2012-03-05 14:15 编辑
回复
6#
nuclearxin
第2列值不一定唯一
作者:
nuclearxin
时间:
2012-03-05 14:16
回复
7#
ywlscpl
作者:
ziyunfei
时间:
2012-03-05 14:38
又一道题?好!
作者:
zooyo
时间:
2012-03-05 22:28
提示:
作者被禁止或删除 内容自动屏蔽
作者:
yinyuemi
时间:
2012-03-05 23:35
回复
10#
zooyo
是的是的,而且我好像把lz的题意理解偏了
我写的那个是第二列排序后的位置
作者:
lastfile
时间:
2012-03-05 23:44
学习了,收藏代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2