【发布时间】:2014-04-25 12:38:29
【问题描述】:
我有一些看起来像这样的文本文件:
558903
5589157
55893434
55907235
.
.
.
7158709
71587172
7158748
我想在字符数与其他行不同的行上添加零。
输出应如下所示:
55890300
55891570
55893434
55907235
.
.
.
71587090
71587172
71587480
提前致谢。
【问题讨论】:
我有一些看起来像这样的文本文件:
558903
5589157
55893434
55907235
.
.
.
7158709
71587172
7158748
我想在字符数与其他行不同的行上添加零。
输出应如下所示:
55890300
55891570
55893434
55907235
.
.
.
71587090
71587172
71587480
提前致谢。
【问题讨论】:
这是使用awk的另一种方式:
awk 'FNR==NR { m = (m > NF ? m : NF); next } { print $0 * 10 ** (m - NF) }' FS= file{,}
【讨论】:
这是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
【讨论】:
两遍 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";
}
【讨论】:
'input.txt' 更改为shift,然后只需for f in *.txt ; do perl script.pl "$f" > "$f.new" ; done。
不将所有数字存储在内存中的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
【讨论】:
您可以使用 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,这将起作用。
【讨论】: