我有一个简单的文本文件,每行包含一些随机数。我希望为数字较少的数字添加前面的零。 有没有办法在命令行(UNIX)上执行此操作
输入文件:
int main()
{
Employee* emp; //pointer to base class object
Manager m1("Ali", "Khan", 5000, 0.2); //object of derived class
emp = &m1; //implicit upcasting
emp->show(); //okay because show() is a base class function
return 0;
}
输出文件:
235
25
1
963258
45
1356924
答案 0 :(得分:4)
使用awk
- printf
:
$ cat testfile
235
25
1
963258
45
1356924
$ awk '{printf("%07d\n", $1)}' testfile # %07d to pad 0s.
0000235
0000025
0000001
0963258
0000045
1356924
答案 1 :(得分:2)
显示示例中的最大位数为7.使用输入文件nums.txt
perl -ne 'printf("%07d\n", $_)' nums.txt > padded_nums.txt
> cat padded_nums.txt
0000235 0000025 0000001 0963258 0000045 1356924
如果实际上不知道最大数字的位数,则需要更多数字
perl -ne 'push @l, $_; }{ $lm = length( (sort {$b <=> $a} @l)[0] ); printf "%0${lm}d\n", $_ for @l' nums.txt
打印相同。
正如评论glenn jackman所述,使用List::Util
模块的最大值为O(n)
,而sort
为O(nlog(n))
。这确实加载了一个模块,虽然它非常轻。
perl -MList::Util=max -ne ' ... $lm = length(max @l); ...'
评论中的每个请求,以下是如何填充shell中的数字,从this post复制
for i in $(seq -f "%05g" 10 15)
do
echo $i
done
此外,在同一答案中,提供了一个printf
格式
$ i=99
$ printf "%05d\n" $i
00099
请注意05g
与05d
之间的seq
与printf
之间的差异。
以下是一种处理整个文件的方法bash
,使用this post。
while read p; do
printf "%07d\n" $p
done < nums.txt
最后,如果未知最大数字的长度,请使用size=${#var}
在bash
中查找字符串的长度。这需要两次数据传递,找到最大长度,然后用它打印。
这些示例适用于bash
,但tcsh
也具有所有这些功能,并使用不同的语法。
答案 2 :(得分:0)
使用bash:
# read the numbers from the file into an array
mapfile -t nums < file
# find the maximum length
maxlen=0
for n in "${nums[@]}"; do len=${#n); (( len > maxlen )) && maxlen=$len; done
# print
for n in "${nums[@]}"; do printf "%0*d\n" $maxlen $n; done
0000235
0000025
0000001
0963258
0000045
1356924