我有一些看起来像这样的文本文件:
558903
5589157
55893434
55907235
.
.
.
7158709
71587172
7158748
我想在与其他行没有相同字符数的行上添加零。
输出应如下所示:
55890300
55891570
55893434
55907235
.
.
.
71587090
71587172
71587480
提前致谢。
答案 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,则此方法有效。