分页: 1 / 2

关键词重复行格式化输出问题

发表于 : 2012-01-30 16:11
fzfh
有一个文本文件,样式如下:
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的话,该如何写代码?
非常感谢!
同时预祝大伙灯节愉快,欢乐吉祥。

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 17:00
tusooa
完全不需要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]

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 17:29
fzfh
对于多行多列,任意列为关键词呢?

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 17:44
josephyoung

代码: 全选

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

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 18:19
fzfh
楼上的对原始文本三列有效。如果是更多列呢?是不是需要加更多的sub?
能不能用循环呢?

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 19:18
josephyoung

代码: 全选

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

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 19:38
eexpress
不是有 uniq

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-30 23:48
fzfh
6楼的代码起作用了。
但是逻辑我不是理解不是很清楚。
看起来应该是以最后一列为关键词进行判断。
如果实际需求不是按最后一列为关键词进行判断的话,能不能在代码中增加一个变量来制定以那一列为关键词进行判断?

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-31 0:28
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]}'

Re: 关键词重复行格式化输出问题

发表于 : 2012-01-31 1:39
fzfh
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 非常感谢。

Re: 关键词重复行格式化输出问题

发表于 : 2012-02-02 17:56
fzfh
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

Re: 关键词重复行格式化输出问题

发表于 : 2012-02-04 21:32
fnan
awk打开文件不会自动关闭,数量有限制,要用close函数关闭,直接用shell处理更方便。

Re: 关键词重复行格式化输出问题

发表于 : 2012-02-05 20:38
fnan
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
#没加空行处理。

Re: 关键词重复行格式化输出问题

发表于 : 2012-02-06 19:52
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)}}'

Re: 关键词重复行格式化输出问题

发表于 : 2012-02-07 4:49
fnan
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)}}'
#还差一点,试试看。