我有一個簡單的文本文件,其中包含每行上的一些隨機數。我希望爲數字較少的數字添加前面的零。 有沒有辦法做到這一點的命令行(UNIX)爲文件中的所有行添加前面的零
輸入文件:
235
25
1
963258
45
1356924
輸出文件:
0000235
0000025
0000001
0963258
0000045
1356924
我有一個簡單的文本文件,其中包含每行上的一些隨機數。我希望爲數字較少的數字添加前面的零。 有沒有辦法做到這一點的命令行(UNIX)爲文件中的所有行添加前面的零
輸入文件:
235
25
1
963258
45
1356924
輸出文件:
0000235
0000025
0000001
0963258
0000045
1356924
使用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
所示示例中的最大數字位數爲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)
,而不是sort
與O(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
請注意上述差異05g
與05d
之間seq
和printf
之間。
這裏是處理與bash
整個文件,從this post使用的方式。
while read p; do
printf "%07d\n" $p
done < nums.txt
最後,使用size=${#var}
找到一個字符串的長度bash
,如果數量最多的長度是不知道。這需要兩遍數據,找到最大長度,然後用它打印。
這些示例適用於bash
,但tcsh
也具有所有這些設施,並使用不同的語法。
這可以使用shell腳本來完成嗎? – databIte
'use List :: Util qw(max); $ lm = length(max @l)'應該比'sort'更有效率。 –
可能更具可讀性:'printf「%0 * d \ n」,$ lm,$ _ for @ l' –
使用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
可以在此一變量,而不是文件中做了什麼? – databIte
@databIte,有東西喜歡? 'echo $ variable | awk'{printf(「%07d \ n」,$ 1)}'' – falsetru
非常重要:'echo「$ variable」'(帶引號) –