将前面的零添加到文件中的所有行

时间:2016-03-17 09:17:06

标签: shell unix command-line sh padding

我有一个简单的文本文件,每行包含一些随机数。我希望为数字较少的数字添加前面的零。 有没有办法在命令行(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

3 个答案:

答案 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),而sortO(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

请注意05g05d之间的seqprintf之间的差异。

以下是一种处理整个文件的方法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