免费注册 查看新帖 |

Chinaunix

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

[文本处理] 呼叫@yinyuemi大牛进来,不会说我没礼貌吧? [复制链接]

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-13 09:58 |只看该作者 |倒序浏览
本帖最后由 bmne 于 2017-04-13 10:10 编辑



因看到你的脚本后,实在是五体投地

今就没礼貌一次。原谅!

还是提高效率的问题(不好解决,所以呼叫)

问题:a  b  各种字符的文档混合(混搭),我知道的几个不同的命令(不放出来了),a b文档稍大一点后,基本解决不了效率的问题,只能凑合着用,慢慢等待输出结果
a.txt
a
b
c
b.txt
1
2
输出
a1
a2
b1
b2
c1
c2

不敢奢望进一步的要求,三个文档混合(其实我特别渴望这个)。更慢的要死。如: a  b  c  这三个文档混合

慢的理由:比如  a=3GB b=10MB   或 a=10MB  b=3GB   或 a=300MB  b=60MB   等等,我表明意思即可

实战中,最终输出结果<20GB  正常在10GB以下  大部分在2-4GB范围

如果你的命令或代码能在混合以前,先预判一下混合后的文档(大概)大小是多少,给出提示,再决定是否下一步,最完美了(便于估计硬盘空间够不够)


请大牛空闲时间帮助下

你若不进来,连看都不看,我一点意见也没有。谁让我没礼貌来者?没理由说必须要帮助我,我知趣

不管怎样,先说声谢谢,辛苦了

等待看看运气如何





论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
2 [报告]
发表于 2017-04-13 15:40 |只看该作者


虽然我是求助yinyuemi  大牛,但,人家不一定来,不一定有时间

真诚希望对此有研究的大牛出手啊

别认为我求助了yinyuemi   你就不出手了。我真心求助的

一并谢谢了!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2017-04-13 18:11 |只看该作者
回复 1# bmne

我只会最简单的awk 'FNR==NR{a[$0];next}{for(i in a)print $0 i}' 小文件 大文件

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
4 [报告]
发表于 2017-04-13 19:26 |只看该作者
回复 3# yinyuemi



谢谢大牛的到来,你来了就可以了,不奢望你穷尽全力研究这个问题

估计这个问题没引起你的兴趣,没让你眼睛一亮。

但,谢谢你上面的出手

辛苦了感谢!







论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
5 [报告]
发表于 2017-04-14 07:41 |只看该作者
回复 3# yinyuemi


大牛,真心希望得到你的帮助。绝没恶意。谢谢正确理解

测试对比了一下
用的数据是
a.txt
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
b.txt
2
3
4
5
6
7
8
输出结果总结对比:(可把a.txt b.txt文件名颠倒一下再测试)

当a.txt大于大于b.txt时
输出结果:(在每一行中)b.txt的数据在行后 a.txt的数据在行前。你的命令没有优势
              (在每一行中)a.txt的数据在行后 b.txt的数据在行前。你的命令还可以使用,但优势不是特别明显

当b.txt大于大于a.txt时
输出结果:(在每一行中)b.txt的数据在行后 a.txt的数据在行前。你的命令还可以使用,但优势不是特别明显
              (在每一行中)a.txt的数据在行后 b.txt的数据在行前。你的命令还可以使用,但优势不是特别明显









论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
6 [报告]
发表于 2017-04-16 16:40 |只看该作者




到此吧,不求助了。估计有难度

我又不能一一求助大牛进来。比如:   jason680          等等太多


不能追求完美,凑合着用现有的即可。   谢谢各位




论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2017-04-16 18:17 |只看该作者
回复 6# bmne

有问题
1. 无解
2. 通解
3. 特解

但你连问题都不会问...不知如何解,
也不想解(还要问清楚,你要什么?)

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
8 [报告]
发表于 2017-04-16 19:14 |只看该作者
本帖最后由 bmne 于 2017-04-16 19:17 编辑

回复 7# jason680


谢谢大牛,没想到休息日有时间进来。惊喜中

可能我笨,可我感觉我说的很明白了。不好意思

一、我求助的主题应该是说明白了吧?(主要是求助ab混合时,效率高一些的命令。参看1楼的内容)

二、如果非要归类,应该是归到“特解”中

三、我5楼中已经把要求的“特解”详细分类给提供出来了
     再解释下“特解”详细分类:
      1、当a.txt大于大于b.txt时(即a是大文件 b是小文件)。混合后的输出结果有两种情况:
           b.txt在后面 a.txt在前面混合输出   请给出命令
           a.txt在后面 b.txt在前面混合输出   请给出命令
      2、当b.txt大于大于a.txt时(即b是大文件 a是小文件)。混合后的输出结果有两种情况:
           b.txt在后面 a.txt在前面混合输出   请给出命令
           a.txt在后面 b.txt在前面混合输出   请给出命令
      3、当a.txt与b.txt的文件大小基本相等时(比如:a.txt=40MB  b.txt=30MB)。这种情况不讨论了。采用上面1 2项给出的命令实验即可

     解释下什么叫“b.txt在后面 a.txt在前面混合输出”。比如
       a.txt
       a
       b
       c
       b.txt
       1
       2
       混合输出:
       a1
       a2
       b1
       b2
       c1
       c2

      另,上面1、2项中,根据效率给出命令即可。不一定非要共4条命令。


谢谢大牛,辛苦







论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2017-04-16 22:02 |只看该作者
本帖最后由 jason680 于 2017-04-17 07:02 编辑

回复 8# bmne

>>可能我笨...
是的,很多问题是你的笨加上懒所产生的...

>>如果非要归类,应该是归到“特解”中
特解只能解,某些特别状况,所以只能解决,两个文档 一大一小
且一定是小的文档 先读...


注:通解为数据库.....但你一直不采用

---------------------------------------------------------------------
>>再解释下“特解”详细分类:
      1、当a.txt大于大于b.txt时(即a是大文件 b是小文件)。混合后的输出结果有两种情况:
           b.txt在后面 a.txt在前面混合输出   请给出命令
           a.txt在后面 b.txt在前面混合输出   请给出命令
      2、当b.txt大于大于a.txt时(即b是大文件 a是小文件)。混合后的输出结果有两种情况:
           b.txt在后面 a.txt在前面混合输出   请给出命令
           a.txt在后面 b.txt在前面混合输出   请给出命令


你认为是四种,其实只有两种
(结果(内容)相同,只是排列先后不一样...)
a1     a1
a2     b1
b1     c1
b2     a2
c1     b2
c2     c2
     
最后两种,只是在打印有差别而以...
一是 print $0 a[n]           #  a1
一是 print a[n] $0           #  1a


   
-------------------------------------------------------

>> a=3GB b=10MB   或 a=10MB  b=3GB   或 a=300MB  b=60MB   等等...
实战中,最终输出结果<20GB  正常在10GB以下  大部分在2-4GB范围


最后一个问题最严重
你的 组合/混合 工具有很大的问题...
我用a,b文档不到M量级(K量级),组合结果3G
-rw-rw-r-- 1 jason jason 3000418650 Apr 16 21:04 50K500K          <==约3G
(500K与500K预估近30G)

但你用的文档都是M量级,G量级,你确说组合结果<20G
你自已测测...就不说你了...

另外,文档内容是否重复,每一行长度大小,...就不提了,不然讨论不完...

注:程序combin.awk在最后


$ awk -vout=50K100K -f combin.awk 50k 100k
Read 50k ...
    50k has 3026 lines
Read 100k ...
    100k has 6019 lines
a b combine total:18213494 lines
21:01:05 start, total items:6019   ,outfile:50K100K
100.0% [======================================] 00:18

$ awk -vout=50K200K -f combin.awk 50k 200k
Read 50k ...
    50k has 3026 lines
Read 200k ...
    200k has 11981 lines
a b combine total:36254506 lines
21:01:31 start, total items:11981   ,outfile:50K200K
100.0% [======================================] 00:38

$ awk -vout=50K500K -f combin.awk 50k 500k
Read 50k ...
    50k has 3026 lines
Read 500k ...
    500k has 30120 lines
a b combine total:91143120 lines
21:02:46 start, total items:30120   ,outfile:50K500K
100.0% [======================================]  01:33

$ ls -l 50K*
-rw-rw-r-- 1 jason jason  599873115 Apr 16 21:01 50K100K          <==近600M
-rw-rw-r-- 1 jason jason 1196939735 Apr 16 21:02 50K200K          <==近1.2G
-rw-rw-r-- 1 jason jason 3000418650 Apr 16 21:04 50K500K          <==约3G


------------文档内容不同(长度短,行数多),组合结果文档更大---------------------------------------------------
$ awk -vout=50K100Ks -f combin.awk 50ks 100ks
Read 50ks ...
    50ks has 8541 lines
Read 100ks ...
    100ks has 17072 lines
a b combine total:145811952 lines
21:31:21 start, total items:17072   ,outfile:50K100Ks
100.0% [======================================]  02:16

$ ls -l 50K100Ks 50ks 100ks
-rw-rw-r-- 1 jason jason   102401 Apr 16 21:27 100ks
-rw-rw-r-- 1 jason jason 1602983821 Apr 16 21:33 50K100Ks          <==近1.6G
-rw-rw-r-- 1 jason jason    51206 Apr 16 21:27 50ks

$ ls -l 50K100K 50k 100k
-rw-rw-r-- 1 jason jason   102415 Apr 16 20:57 100k
-rw-rw-r-- 1 jason jason  599873115 Apr 16 21:01 50K100K          <==近600M
-rw-rw-r-- 1 jason jason    51201 Apr 16 20:57 50k


-----------------------------------------------------------------------------------

$ cat combin.awk
function bar_set(num, msg,  cmd, wid, len,dot){
  _bar_sec_sys = systime();
  printf("%s start, total items:%s   %s\n", strftime("%H:%M:%S"), num, msg);
  _bar_per_all = num;
  _bar_wid = 80;
  _bar_stp = int(num /20000)+1;
  cmd = "tput cols";
  cmd | getline wid;
  close(cmd);
  if(wid != 0) _bar_wid = wid;

  #123456789012345678901234567890123456789012345678901234567890
  #100.0% [====================] 01:00:00
  # (6)  7      (>20)          30  (8)  39   

  if(_bar_wid < 40){
    print "The screen columns is too small(" _bar_wid ")";
    print "Please change it and more than 39" ;
    exit(1);
  }
  
  _bar_dot_all = _bar_wid - 20;

  _alv[1] = "*";
  _alv[2] = "\\";
  _alv[3] = "|";
  _alv[0] = "/";
  bar_make(1);
}
function bar_make(num,    n, per, dot, all, per_str, alv_str, dot_str, sec){
  _bar_num = num;
  per_str = sprintf("%5.1f% ", num / _bar_per_all * 100);

  dot = int(per_str / 100 * _bar_dot_all)
  _bar_cnt = ++_bar_cnt % 4;
  alv_str = _alv[_bar_cnt];

  if(_bar_num == 1 || dot != _bar_dot){
    _bar_dot = dot;
    _bar_dot_s = "";
    _bar_dot_e = "";
    for(n=0;n<dot; ++n)
      _bar_dot_s = _bar_dot_s"=";
    for(n = dot+1; n <_bar_dot_all; ++n)
      _bar_dot_e = _bar_dot_e".";
  }
  if(+per_str == 100) alv_str="";
  dot_str = _bar_dot_s alv_str _bar_dot_e;

  sec = systime() - _bar_sec_sys;
  if(_bar_num ==1 || sec != _bar_sec){
    _bar_sec = sec
    if(sec < 3600){
      _bar_sec_str = sprintf("%02d:%02d", int(sec/60), sec%60);
    }else{
      _bar_sec_str = sprintf("%02d:%02d:%02d", int(sec/3600),
                         int( (sec%3600)/60), sec%60);
    }
  }
  printf("\r%s[%s] %s", per_str, dot_str, _bar_sec_str);

}
function bar(num){
  if(num - _bar_num < _bar_stp) return;
  bar_make(num);
}
BEGIN{
  total = 1;
}
FNR==1{
  print " Read " FILENAME " ..."
  cmd="wc -l " FILENAME;
  cmd | getline line;
  total *= line;
  print "    " FILENAME " has " (+line) " lines"
  T = NR;
  close(cmd);
}
FNR==NR{
  a[NR]=$0
  next;
}
FNR == 1{
  if(out=="")out="c.txt"
  print " a b combine total:" total " lines"
  bar_set(+line, ",outfile:"out);
}
{
  bar(FNR)
  # do something by yourself
  for(n=1;n<T;++n)
    print a[n] $0 > out
}
END{
  print""
}

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
10 [报告]
发表于 2017-04-17 08:10 |只看该作者



大牛辛苦了

看来你继续采用的是“通解”型。太厉害了
别生气,我说实话。我的上一个求助。yinyuemi大牛的“特解”很厉害的,让人折服。但,你的“通解”也算可以
这次你继续采用“通解”,证明效率方面还是一种正确的选择

我以前回复过“本友会机友会摄友会”,我说我笨,考试零分不过瘾比较喜欢负分(因为他总让我云里雾里,所以我只能这样)
但,这次给你说,我就不相信就我一个笨人。我的意思,感谢你给上课(给我上课用的字符最多),太棒啦,估计旷课的人不会太多(请看浏览次数)

如果非要“鸡蛋里面挑骨头”
唯一遗憾:混合前,根据a  b 先预测一下输出结果的大小,就完美了(别事后预测,这样省工省时),请给个单独的命令?

不敢再麻烦你关于效率的问题了,怕你说我,我都给你两个这方面的脚本了,你还不会?


感谢感谢感谢!




另,说点已经没意义的事(再次证明我笨

-----------------------------------------------
你认为是四种,其实只有两种
(结果(内容)相同,只是排列先后不一样...)
a1     a1
a2     b1
b1     c1
b2     a2
c1     b2
c2     c2

最后两种,只是在打印有差别而以...
一是 print $0 a[n]           #  a1
一是 print a[n] $0           #  1a
------------------------------------------------
解释下,我为什么要说是四种情况

实战中发现的
同一条命令,因a b的文档大小不同,并且a b先后顺序不同。结果,输出效率不一样

比如(这里只是比如,因yinyuemi大牛已经给出排序)

1、当a.txt大于大于b.txt时(即a是大文件 b是小文件)
awk 'FNR==NR{a[$0];next}{for(i in a)print $0 i}' a  b
awk 'FNR==NR{a[$0];next}{for(i in a)print $0 i}' b  a

2、当b.txt大于大于a.txt时(即b是大文件 a是小文件)
awk 'FNR==NR{a[$0];next}{for(i in a)print $0 i}' a  b
awk 'FNR==NR{a[$0];next}{for(i in a)print $0 i}' b  a

我的意思
上面1、2项中,根据效率给出理想命令即可。不一定非要共4条命令。
希望在“特解”中用命令能解决这个问题







您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP