2016-03-17 45 views
2

我有一個簡單的文本文件,其中包含每行上的一些隨機數。我希望爲數字較少的數字添加前面的零。 有沒有辦法做到這一點的命令行(UNIX)爲文件中的所有行添加前面的零

輸入文件:

235 
25 
1 
963258 
45 
1356924 

輸出文件:

0000235 
0000025 
0000001 
0963258 
0000045 
1356924 

回答

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 
+0

可以在此一變量,而不是文件中做了什麼? – databIte

+0

@databIte,有東西喜歡? 'echo $ variable | awk'{printf(「%07d \ n」,$ 1)}'' – falsetru

+0

非常重要:'echo「$ variable」'(帶引號) –

2

所示示例中的最大數字位數爲7.帶輸入文件nums.txt

perl -ne 'printf("%07d\n", $_)' nums.txt > padded_nums.txt 

>貓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); ...' 

每一個評論的請求,這裏是如何鍵盤的數字殼,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也具有所有這些設施,並使用不同的語法。

+0

這可以使用shell腳本來完成嗎? – databIte

+0

'use List :: Util qw(max); $ lm = length(max @l)'應該比'sort'更有效率。 –

+0

可能更具可讀性:'printf「%0 * d \ n」,$ lm,$ _ for @ l' –

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 
相關問題