免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2935 | 回复: 11
打印 上一主题 下一主题

如何按关键字拼凑两个文本文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-17 11:11 |只看该作者 |倒序浏览
比如第一个文本a.txt ,格式如下|USRID|NAME|LANG|
     第二个文本b.txt ,格式如下|USRID|STATUS|LEVEL|

   怎样把USDID一样的行拼成新行输出到一个文件,不匹配的不输出?

   我写了一个SHELL发现速度太慢,请高手指教.



if [ -f ok.log ];then
        rm ok.log
fi

while read LINE
do
        USRID=`echo $LINE|cut -d"|" -f1`
        OWNBCHCOD=`echo $LINE|cut -d"|" -f3`
        PARBCHCOD=`echo $LINE|cut -d"|" -f4`
        USG=`echo $LINE|cut -d"|" -f5`
        ETY=`echo $LINE|cut -d"|" -f6`
        LEV=`echo $LINE|cut -d"|" -f7`
        REL=`echo $LINE|cut -d"|" -f8`
        
        awk -F"|" '{if($1==USRID) {printf("%s%s|%s|%s|%s|%s|%s|\n",$0,OWNBCHCOD,PARBCHCOD,USG,ETY,LEV,REL)} }' USRID=$USRID OWNBCHCOD=$OWNBCHCOD PARBCHCOD=$PARB
CHCOD USG=$USG ETY=$ETY LEV=$LEV REL=$REL b.txt>>ok.log

done<a.txt

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-07-17 12:53 |只看该作者

如何按关键字拼凑两个文本文件?

  1. while read line
  2. do
  3. a=`echo $line|awk -F"|" '{print $2}'`
  4. b=`grep "^|"${a} b.txt`
  5. if [ -n "$b" ]
  6. then
  7.   echo ${line}${b}
  8. fi
  9. done <a.txt
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-07-17 17:46 |只看该作者

如何按关键字拼凑两个文本文件?

还是速度太慢,似乎AWK ,SED,GREP都是全局循环,执行效率太低.
如果上述文件各有1500行,则最后要执行1500*1500次.

论坛徽章:
0
4 [报告]
发表于 2003-07-17 18:00 |只看该作者

如何按关键字拼凑两个文本文件?

如果上述文件各有1500行,只要执行1500+1500次
  1. [gary@gary prg]$ cat a.txt
  2. bb|b2|b3
  3. dd|d2|d3
  4. ee|e2|e3
  5. aa|a2|a3
  6. [gary@gary prg]$ cat b.txt
  7. aa|a4|a5
  8. bb|b4|b5
  9. cc|c4|c5
  10. ee|e4|e5
  11. [gary@gary prg]$ cat merge.sh
  12. #!/bin/bash
  13. end() {
  14.         rm /tmp/a$$
  15.         rm /tmp/b$$
  16.         exit
  17. }
  18. reada() {
  19.         read -u 3 lineA || end
  20. }
  21. readb() {
  22.         read -u 4 lineB || end
  23. }
  24. sort a.txt >/tmp/a$$
  25. sort b.txt >/tmp/b$$

  26. exec 3</tmp/a$$
  27. exec 4</tmp/b$$
  28. reada
  29. readb
  30. while true ;do
  31.         if [[ "${lineA%%|*}" = "${lineB%%|*}" ]]; then
  32.                 echo "${lineA}|${lineB#*|}"
  33.                 reada
  34.                 readb
  35.         elif [[ "${lineA%%|*}" > "${lineB%%|*}" ]]; then
  36.                 readb
  37.         else
  38.                 reada
  39.         fi
  40. done
  41. [gary@gary prg]$ ./merge.sh
  42. aa|a2|a3|a4|a5
  43. bb|b2|b3|b4|b5
  44. ee|e2|e3|e4|e5
复制代码

OS: Redhat 8.0
SHELL: Bash

论坛徽章:
0
5 [报告]
发表于 2003-07-17 19:17 |只看该作者

如何按关键字拼凑两个文本文件?

我也来一个,文件file1和file2某些字段合并.
$ awk -f un.awk


  1. #awk script [ un.awk ]
  2. BEGIN{
  3.                 FS="|"
  4.                 while("cat file1"|getline){
  5.                                 uid[$2]=$2
  6.                                 name[$2]=$4
  7.                 }
  8.                 while("cat file2"|getline){
  9.                                 uid[$2]=$2
  10.                                 level[$2]=$5
  11.                 }
  12.                 for(idx in uid){
  13.                                 printf("|%s|%s|%s|\n",uid[idx],name[idx],level[idx])
  14.                 }               
  15.                 exit            
  16. }                              
复制代码

论坛徽章:
0
6 [报告]
发表于 2003-07-18 08:59 |只看该作者

如何按关键字拼凑两个文本文件?

先按关键字排序,在查找

论坛徽章:
0
7 [报告]
发表于 2003-07-18 10:20 |只看该作者

如何按关键字拼凑两个文本文件?

我也来一个,试试快慢
[/code]
cat f1>>f2
sort -t\| -k 1 f2|sed 's/|/:/' >f.tmp
awk -F ":" '
{if (key==$1) {printf "%s|%s|%s\n",key,line,$2}
else {key=$1;line=$2}}' f.tmp >f.new
rm f.tmp

论坛徽章:
0
8 [报告]
发表于 2003-07-19 10:59 |只看该作者

如何按关键字拼凑两个文本文件?

join试试这个命令

论坛徽章:
0
9 [报告]
发表于 2003-07-19 11:57 |只看该作者

如何按关键字拼凑两个文本文件?

try command "paste"

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2003-07-20 11:29 |只看该作者

如何按关键字拼凑两个文本文件?

[quote]原帖由 "zhangyo1557"]join试试这个命令[/quote 发表:
  
同意!
借用fbmail 的数据
  1. sort file1 >a
  2. sort file2 >b
  3. join -t"|" -j1 2 -j2 2  a b  |sed 's/||/|/g;s/^/|/'  
  4. |123456||张二|abcdefg||AAAAAA
  5. |21332423|河山|okojwer|CCCCCC
  6. |456789|王习|yummok|BBBBBB
复制代码
   
如果去掉行首的字符“|”,就会更好处里了(可以省略
-j1 2 -j2 2|sed 's/||/|/g;s/^/|/' 部分的内容)!
简化后
  1. join -t"|"  aa bb
  2. 结果
  3. 123456|张二|abcdefg|AAAAAA
  4. 21332423|河山|okojwer|CCCCCC
  5. 456789|王习|yummok|BBBBBB
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP