CU论坛的一个问题...刚好正在学习脚本,折腾了一下,OK,记录一下.
问题:
两文件第一列相同,需要得到每一行除第一列外相同的数的个数,如
- ~$ cat kkk
- 1 2 3
- 2 9 8 3
- 3 6 7 8 5
- 4 3 5 1
- 5 8
- cat ddd
- 1 3 2
- 2 8 9 1
- 3 6 8 9 5
- 4 3 2
- 5 9 2
希望得到的结果
- $ cat sort.txt
- 1 2
- 2 2
- 3 3
- 4 1
- 5 0
结果中第一列为文件第一列,第二列为两文件每一列重复的个数,如结果中第一行第二列的2 由于d.txt第一行与e.txt第一行,除第一列外有两个数是重复的,而得到的
脚本:
- #!/bin/bash
- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
- export PATH
- Var_file1=`mktemp /tmp/tmp.XXXXXXX`
- Var_file2=`mktemp /tmp/tmp.XXXXXXX`
- Var_id=`mktemp /tmp/tmp.XXXXXXX`
- Var_sort=`mktemp /tmp/tmp.XXXXXX`
- cut -d ' ' -f 2- $1 > $Var_file1
- cut -d ' ' -f 2- $2 > $Var_file2
- cut -d ' ' -f 1 $2 > $Var_id
- while read -u 3 Var_a; read -u 5 Var_b
- do
- echo ${Var_a} ${Var_b} | sed 's: :\n:g' | sort | uniq -d |wc -l >> $Var_sort
- done 3<$Var_file1 5<$Var_file2
- paste $Var_id $Var_sort>sort.txt
- rm -f $Var_file1 $Var_file2 $Var_id $Var_sort
这个脚本用到了文件描述符,同时对两文件实现读取...记录一下...
如果用awk有更简单的办法,其它兄弟的
- awk 'NR==FNR{for(i=2;i<=NF;i++){a[FNR","i]=$i;b[FNR]=NF}}NR>FNR{n=0;for(i=2;i<=NF;i++)for(j=1;j<=b[FNR];j++)if($i==a[FNR","j])n++;print $1,n}' kkk ddd
awk还没熟悉到这个地步...学习中.... 还有管道命令,其它兄弟的
- while read line; do echo "${line%% *} $(echo "${line#* }" | tr ' ' '\n' | sort | uniq -d | wc -l)"; done < <(join ddd kkk)
本文转自 nonono11 51CTO博客,原文链接:http://blog.51cto.com/abian/1129609,如需转载请自行联系原作者