分页: 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]}'

非常感谢。
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)}}'
#还差一点,试试看。