当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 16:11 

注册: 2008-08-01 21:29
帖子: 31
送出感谢: 1
接收感谢: 0 次
有一个文本文件,样式如下:
tab1 tab2 tab3
aa ee 11
bb ff 22
cc gg 33
dd hh 55
aa ee 77
bb ff 11
cc gg 88
dd hh 33
以第三列内容为关键词,分离出关键词重复的行;
上面的例子,有11,33两个关键词有重复行;
关键词重复行11内容为:
aa ee 11
bb ff 11
和关键词重复行33内容为:
cc gg 33
dd hh 33
然后输出2个文本,11和33
11的格式为:
aa-bb
ee-ff
33的格式为:
cc-dd
gg-hh

如果用awk或者sek的话,该如何写代码?
非常感谢!
同时预祝大伙灯节愉快,欢乐吉祥。


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 17:00 

注册: 2008-10-31 22:12
帖子: 6546
系统: 践兔
送出感谢: 18
接收感谢: 25
完全不需要awk,sed
[bash]declare -A hash
while read a b c; do
if [[ ${hash[$c]} == 1 ]] ; then
echo "$a-$b" >> "$c"
elif [[ ${hash[$c]} ]] ; then
echo "${hash[$c]}" > "$c"
echo "$a-$b" >> "$c"
hash[$c]=1
else
hash[$c]="$a-$b"
fi
done[/bash]


_________________
代码:
] ls -ld //


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 17:29 

注册: 2008-08-01 21:29
帖子: 31
送出感谢: 1
接收感谢: 0 次
对于多行多列,任意列为关键词呢?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 17:44 
头像

注册: 2011-11-05 18:53
帖子: 158
地址: 南极圈
送出感谢: 0 次
接收感谢: 7
代码:
awk '!a[$3]{a[$3]=$1"\n"$2;nlen=nlen<length(a[$3])?length(a[$3]):nlen;next}{sub("\n","-"$1"\n",a[$3]);sub("$","-"$2,a[$3])}END{for(i in a)if(length(a[i])>nlen)print a[i] > i}' file


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 18:19 

注册: 2008-08-01 21:29
帖子: 31
送出感谢: 1
接收感谢: 0 次
楼上的对原始文本三列有效。如果是更多列呢?是不是需要加更多的sub?
能不能用循环呢?


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 19:18 
头像

注册: 2011-11-05 18:53
帖子: 158
地址: 南极圈
送出感谢: 0 次
接收感谢: 7
代码:
awk 'NR==1{L=NF}{b[$NF]++;for(i=1;i<NF;i++)a[i,$NF]=a[i,$NF]?a[i,$NF]"-"$i:$i}END{for(i=1;i<L;i++)for(j in b)if(b[j]>1)print a[i,j]>j}' file


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 19:38 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
不是有 uniq


_________________
● 鸣学


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-30 23:48 

注册: 2008-08-01 21:29
帖子: 31
送出感谢: 1
接收感谢: 0 次
6楼的代码起作用了。
但是逻辑我不是理解不是很清楚。
看起来应该是以最后一列为关键词进行判断。
如果实际需求不是按最后一列为关键词进行判断的话,能不能在代码中增加一个变量来制定以那一列为关键词进行判断?


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-31 0:28 
头像

注册: 2011-11-05 18:53
帖子: 158
地址: 南极圈
送出感谢: 0 次
接收感谢: 7
更改"key"的值就是了
代码:
awk -vkey=3 'NR==1{L=NF}{b[$key]++;for(i=1;i<=NF;i++)if(i!=key)a[i,$key]=a[i,$key]?a[i,$key]"-"$i:$i}END{for(i=1;i<=L;i++)for(j in b)if(b[j]>1 && i!=key)print a[i,j]}'



_________________
评价: 3.7% fzfh
 
页首
 用户资料  
 
10 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-01-31 1:39 

注册: 2008-08-01 21:29
帖子: 31
送出感谢: 1
接收感谢: 0 次
josephyoung 写道:
更改"key"的值就是了
代码:
awk -vkey=3 'NR==1{L=NF}{b[$key]++;for(i=1;i<=NF;i++)if(i!=key)a[i,$key]=a[i,$key]?a[i,$key]"-"$i:$i}END{for(i=1;i<=L;i++)for(j in b)if(b[j]>1 && i!=key)print a[i,j]}'

:em11 非常感谢。


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-02-02 17:56 

注册: 2008-08-01 21:29
帖子: 31
送出感谢: 1
接收感谢: 0 次
josephyoung 写道:
更改"key"的值就是了
代码:
awk -vkey=3 'NR==1{L=NF}{b[$key]++;for(i=1;i<=NF;i++)if(i!=key)a[i,$key]=a[i,$key]?a[i,$key]"-"$i:$i}END{for(i=1;i<=L;i++)for(j in b)if(b[j]>1 && i!=key)print a[i,j]}'

发现一个新问题,当行数超过1200行以后,这个代码如果在print后面用>j来输出文件的话就会出错。
错误提示:fatal: expression for `>' redirection has null string value


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-02-04 21:32 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
awk打开文件不会自动关闭,数量有限制,要用close函数关闭,直接用shell处理更方便。


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-02-05 20:38 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
declare -A a=();key=3;while read l;do set $l;for ((n=1;n<=$#;n++));do [[ $n -ne $key ]] && a[${!key}-$n]=${a[${!key}-$n]}-${!n};done;done <file;for i in ${!a[*]};do [[ ${a[$i]} == ""-*-*"" ]] && echo ${a[$i]/-/} ${i/-*/};done
#没加空行处理。


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-02-06 19:52 
头像

注册: 2011-11-05 18:53
帖子: 158
地址: 南极圈
送出感谢: 0 次
接收感谢: 7
多谢fnan指出这个问题,这样改不知道可以不可以
代码:
awk -vkey=3 'NR==1{L=NF}{b[$key]++;for(i=1;i<=NF;i++)if(i!=key)a[i,$key]=a[i,$key]?a[i,$key]"-"$i:$i}END{for(i=1;i<=L;i++)for(j in b){if(b[j]>1 && i!=key)print a[i,j]>j;close(j)}}'


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 关键词重复行格式化输出问题
帖子发表于 : 2012-02-07 4:49 

注册: 2009-07-01 22:04
帖子: 919
送出感谢: 0 次
接收感谢: 13
josephyoung 写道:
多谢fnan指出这个问题,这样改不知道可以不可以
代码:
awk -vkey=3 'NR==1{L=NF}{b[$key]++;for(i=1;i<=NF;i++)if(i!=key)a[i,$key]=a[i,$key]?a[i,$key]"-"$i:$i}END{for(i=1;i<=L;i++)for(j in b){if(b[j]>1 && i!=key)print a[i,j]>j;close(j)}}'

#还差一点,试试看。


_________________
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译