【问题标题】:Adding a zeros in a text file using awk使用 awk 在文本文件中添加零
【发布时间】:2014-04-25 12:38:29
【问题描述】:

我有一些看起来像这样的文本文件:

558903
5589157
55893434
55907235
.
.
.
7158709
71587172
7158748

我想在字符数与其他行不同的行上添加零。

输出应如下所示:

55890300
55891570
55893434
55907235
.
.
.
71587090
71587172
71587480

提前致谢。

【问题讨论】:

    标签: macos bash shell awk


    【解决方案1】:

    这是使用awk的另一种方式:

    awk 'FNR==NR { m = (m > NF ? m : NF); next } { print $0 * 10 ** (m - NF) }' FS= file{,}
    

    【讨论】:

      【解决方案2】:

      这是awk的一种方式:

      $ awk '
      {
          max = ((max > length($1)) ? max : length($1))
          a[NR] = $1
      }
      END { 
          for(x=1; x<=NR; x++) {
              n = max - length(a[x])
              while(n-->0) {
                  a[x] = a[x] "0"
              }
              print a[x]
          }
      }' file
      55890300
      55891570
      55893434
      55907235
      71587090
      71587172
      71587480
      

      【讨论】:

      • 效果很好!谢谢。
      【解决方案3】:

      两遍 Perl 解决方案。它也适用于无法保存在内存中的大文件:

      #!/usr/bin/perl
      use warnings;
      use strict;
      
      my $length = 0;
      
      open my $IN, '<', 'input.txt' or die $!;
      while (<$IN>) {
          $length = length if length > $length;
      }
      
      $length--;       # Ignore newlines.
      seek $IN, 0, 0;
      while (<$IN>) {
          chomp;
          print $_, '0' x ($length - length), "\n";
      }
      

      【讨论】:

      • 我不知道如何使用 perl。如果我想让这个脚本遍历我的所有文件,我该怎么办?对于 *.txt 中的 f 执行 ???
      • @JM88:您可以在脚本中将'input.txt' 更改为shift,然后只需for f in *.txt ; do perl script.pl "$f" &gt; "$f.new" ; done
      【解决方案4】:

      不将所有数字存储在内存中的awk解决方案:

      awk 'NR==FNR {if (length($1)>m) m=length($1); next }
            length($1)<m { $1=$1*(10**(m-length($1))) } 1' file file
      
      55890300
      55891570
      55893434
      55907235
      71587090
      71587172
      71587480
      

      【讨论】:

        【解决方案5】:

        您可以使用 BASH 和 bc 来适当地乘以数字。

        while read l; do
            n=${#l}
            if [ $n -lt 8 ] && [[ $l =~ [0-9]+ ]]; then
                d=$((8-n))
                echo "$l*(10^$d)"|bc
            else
                echo $l
            fi
        done < file
        

        如果数字中的最高位数是 8,这将起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-09
          • 2017-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 2012-03-19
          • 1970-01-01
          相关资源
          最近更新 更多