【问题标题】:calculating rows in text files (bash/perl)计算文本文件中的行(bash/perl)
【发布时间】:2014-02-28 23:41:59
【问题描述】:

我在这里需要哪些命令?我猜 catjoin -1 2 -2 2 ,但是为了计算? (否则,我应该使用 Regex 自己编写代码吗?是否有任何功能齐全的命令行电子表格软件?)

input.txt(“uniq -c”之后的列表)

 1    abc
 10   def
 100  ghi

加入.txt

-1   def
-1   def
-10  ghi
-10  ghi

输出:

1    abc
8    def
80   ghi

..thanks=)

【问题讨论】:

    标签: perl bash join merge


    【解决方案1】:

    假设这些文件是制表符分隔的,保存并调用它:

    perl sumfiles.pl src1.txt src2.txt
    

    没有错误检查或脚本中没有的内容,您可以根据需要缩短它。

    #!/usr/bin/env perl
    use warnings;
    use strict;
    
    my %scores;
    while (my $l = <>) {
            chomp $l;
            my ($num, $key) = split(/\t/, $l);
            $scores{$key} += $num;
    }
    
    for my $k (sort keys %scores) {
            print "$scores{$k}\t$k\n";
    }
    

    编辑:下面@mapeec 的较短版本。短得多,除了我最终会添加 20 行 cmets 以便我可以解开它在做什么...... :-)

    【讨论】:

    • 谢谢!! (uniq -c 列表有不同的空格,但我会想办法相应地编辑它)
    • 然后尝试\s+ 而不是\t
    • 也是一个领先的......所以我只运行 perl -pi -e 's/[^0-9]*([0-9]*) (.*)/$1\t$2 /' input before... 更有趣的是:perl 如何在你的脚本中打开这两个文件?
    • &lt;&gt; 具有“将任何命令行参数视为文件并一个接一个地打开和读取它们”的魔力。如果没有任何命令行参数,它将尝试 STDIN 和其他聪明的方法。请参阅此处的“I/O 运算符”:perldoc.perl.org/perlop.html(或命令行上的perldoc perlop)。
    【解决方案2】:
    perl -MFile::Slurp -lane'
      BEGIN{ $s{ $_->[1] } += $_->[0] for map [split], read_file(pop) }
      $F[0] += $s{ $F[1] };
      print "@F";
    ' input.txt join.txt
    

    输出

    1 abc
    8 def
    80 ghi
    

    【讨论】:

      【解决方案3】:

      使用 awk

      awk 'NR==FNR{a[$2]+=$1;next}{print a[$2]+$1,$2}' join.txt input.txt
      
      1 abc
      8 def
      80 ghi
      

      【讨论】:

        猜你喜欢
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多