使用awk在文本文件中添加零

时间:2014-03-19 10:31:58

标签: macos bash shell awk

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

558903
5589157
55893434
55907235
.
.
.
7158709
71587172
7158748

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

输出应如下所示:

55890300
55891570
55893434
55907235
.
.
.
71587090
71587172
71587480

提前致谢。

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

两次通过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";
}

答案 2 :(得分:1)

这是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 :(得分:1)

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

答案 4 :(得分:0)

您可以将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,则此方法有效。