免费注册 查看新帖 |

Chinaunix

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

急!!怎样写join命令?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-08 16:22 |只看该作者 |倒序浏览
文本1:
300880158973          101064            1553.60 YCJi000103528799
300880158938          101069            1497.50 YCJe000103520785
300880158973          101326          1850.00 YCJf000203528852
300880159033          101326           1850.00 YCJf000203541648
300880158964          101494           1495.50 YCJb000203526871
300880158961          102157           3971.50 YCJb000103526150
文本2:
300880158973    101064  1553.60 YCJi000103528799
300880158931    101069  1497.51 YCJe000103520781
300880158973    101326  1850.00 YCJf000203528852
300880158964    101494  1495.50 YCJb000203526871
300880158961    102157  3971.50 YCJb000103526150
现都已2,3,4列为key排序
现要找出只出现在文本1的那些行,要求以第二三四列作比较,第一列不作比较,正确结果应为
300880158938          101069            1497.50 YCJe000103520785
300880159033          101326           1850.00 YCJf000203541648
我的命令是:
join -v1 -o 1.1 1.2 1.3 1.4 -1 2,3,4  -2 2,3,4  text1 text2
但结果什么都没有,各位老大,应怎样写这个join命令呢?

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

急!!怎样写join命令??

diff不行吗?

论坛徽章:
0
3 [报告]
发表于 2003-05-08 18:50 |只看该作者

急!!怎样写join命令??

300880158973 101064 1553.60 YCJi000103528799
为什么不在你的输出里?还有

论坛徽章:
0
4 [报告]
发表于 2003-05-08 18:53 |只看该作者

急!!怎样写join命令??

#!/usr/local/bin/perl

foreach(`cat a`)
{
        @temp = split(/ /, $_);
        $x = "$temp[1] $temp[2] $temp[3]";
       
        @result = `grep \"$x\" b`;
        print "$_" unless @result;
}

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

急!!怎样写join命令??

SCO UNIX 5.0.5测试通过
  1. #!/bin/sh
  2. cp file1 file.bak
  3. while read line
  4. do
  5.     grep -v "$line" file1 >tt
  6.     mv tt file1
  7. done <file2

  8. 300880158938 101069 1497.50 YCJe000103520785
  9. 300880159033 101326 1850.00 YCJf000203541648

复制代码

如果数据量大的话,效率可能不好!

论坛徽章:
0
6 [报告]
发表于 2003-05-08 20:32 |只看该作者

急!!怎样写join命令??

老大:你这样作没有做到不比较第一列的要求,而且我的两个文本列与列之间的空格不完全相同,不像上面我列的那么整齐,如
文本1中
300880158961 ****102157*3971.50******YCJb000103526150
文本2中
300880158960**102157***3971.50****YCJb000103526150
(帖子里没法表示出不同空格的样子,只好用*号代替空格位置)
空格不确定,第一列可以不同,象上面列举的除第一列不同其他列相同视为这两行数据相同,如第二三四列只要有一列不同就认为这两行不同,需要将文本1中的这样一行写到一个新文件中。
高手快救命呀!!能用shell做吗?

论坛徽章:
0
7 [报告]
发表于 2003-05-08 22:11 |只看该作者

急!!怎样写join命令??

这么多空格必须全部原样保留吗?
如果多个空格不是必须的话,可以先将多个空格用一个空格替代,使数据格式统一后再作处理:
  1. sed 's/[ ]\{2,\}/ /g' file1 >file11
  2. sed 's/[ ]\{2,\}/ /g' file2 >file22
复制代码

另外:你的第一列指的是“3”(列)还是“300880158973”(字段)不大明白,我看你的数据全部是3008打头的,二三四列数据相同全是008,所以没有考虑“要求以第二三四列作比较”的条件。

论坛徽章:
0
8 [报告]
发表于 2003-05-09 01:14 |只看该作者

急!!怎样写join命令??

是应该先处理空格。
这样就可以在file2中搜索file1的每一行的后3个字段了。
就是将file1每行
“300880158973[空格 ]101064 1553.60 YCJi000103528799”
看为2部分,忽略的部分+空格+搜索的部分,
然后在file2中搜索第2部分。

论坛徽章:
0
9 [报告]
发表于 2003-05-09 06:34 |只看该作者

急!!怎样写join命令??

[quote]原帖由 "muzx"]另外:你的第一列指的是“3”(列)还是“300880158973”(字段)不大明白,我看你的数据全部是3008打头的,二三四列数据相同全是008,所以没有考虑“要求以第二三四列作比较”的条件。[/quote 发表:


第一列指的“300880158973”(字段),原来空格可以不保留原样,但至少总要有一个空格分隔,第三个字段(有小数的那列)要按数值处理,即认为
10=10.00=10.0=10.000=010.00
(是不是我的要求高了些 )
有更简洁快速的办法吗,因为要求实时处理。帮帮忙呀,最好能给个shell的样本,谢谢各位热心人!!!!

论坛徽章:
0
10 [报告]
发表于 2003-05-09 08:17 |只看该作者

急!!怎样写join命令??

试试看:SCOUNIX 5.0.5
  1. awk '{printf"%s %s %.3f %s\n",$1,$2,$3,$4}' <file1 >file11
  2. awk '{printf"%s %s %.3f %s\n",$1,$2,$3,$4}' <file2 >file22
  3. while read line
  4. do
  5.     str=`echo "$line"|awk '{printf"%s %.3f %s",$2,$3,$4}'`
  6.     sed "/$str/d" file11 >tt
  7.     mv tt file11
  8. done <file22
  9. cat file11
  10. 300880158938 101069 1497.500 YCJe000103520785
  11. 300880159033 101326 1850.000 YCJf000203541648
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP