我試圖圍繞這個問題撓頭,但無法理解我下面的一個班輪有什么問題。
鑒于
echo "5" | wc -m
2
然后
echo "55" | wc -m
3
我嘗試使用awkif 陳述句在所有 9 以下的數字前添加一個零,如下所示:
echo "5" | awk '{ if ( wc -m $0 -eq 2 ) print 0$1 ; else print $1 }'
05
這是“正確的”,但是對于 2 位數字,我在前面得到相同的零。
echo "55" | awk '{ if ( wc -m $0 -eq 2 ) print 0$1 ; else print $1 }'
055
怎么來的?我認為這只會回傳55而不是055. 我現在明白我構建的 if 陳述句是錯誤的。
什么是正確的方法(如果它曾經存在過)要求awk評估是否來自|has2字符的任何內容,就像一個人會做的那樣wc -m?
我對在命令列中添加前導零的最佳方式不感興趣(有足夠的重復項)。
謝謝!
uj5u.com熱心網友回復:
我建議使用printf:
printf "d\n" "$(echo 55 | wc -m)"
03
printf "d\n" "$(echo 123456789 | wc -m)"
10
注意:printf可作為 bash 內置程式使用。它主要遵循C函式的約定printf()..檢查
help printf # For the bash builtin in particular
man 3 printf # For the C function
uj5u.com熱心網友回復:
事實:
- 在 AWK 中,字串或變數只是通過并排放置來連接。
例如:awk '{b="v" ; print "a" b}' - 在 AWK 中,未定義的變數等于空字串或 0。
例如:awk '{print a "b", -a}' - 在 AWK 中,非零字串在
if.
例如:awk '{ if ("a") print 1 }'
wc -m $0 -eq 2被決議為(即-優先于字串連接):
wc -m $0 -eq 2
( wc - m ) ( $0 - eq ) 2
^ - integer value 2, converted to string "2"
^^ - undefined variable `eq`, converted to integer 0
^^ - input line, so string "5" converted to integer 5
^ - subtracts 5 - 0 = 5
^^^^^^^^^^^ - integer 5, converted to string "5"
^ - undefined variable "m", converted to integer 0
^^ - undefined variable "wc" converted to integer 0
^^^^^^^^^ - subtracts 0 - 0 = 0, converted to a string "0"
^^^^^^^^^^^^^^^^^^^^^^^^^ - string concatenation, results in string "052"
的結果wc -m $0 -eq 2是字串 052(請參閱awk '{ print wc -m $0 -eq 2 }' <<<'5')。因為字串不為空,if總是為真。
它應該只回傳 55 而不是 055
不,不應該。
我構建的 if 陳述句錯誤嗎?
不,if 陳述句具有有效的 AWK 語法。您對其作業方式的期望與它的實際作業方式不符。
uj5u.com熱心網友回復:
真正讓它作業(不是你想要的):
echo 5 | awk '
{
cmd = "echo " $1 " | wc -m"
cmd | getline len
if (len == 2)
print "0"$1
else
print $1
}'
但是為什么當您可以使用它時:
echo 5 | awk 'length($1) == 1 { $1 = "0"$1 } 1'
或者使用printf其他答案中看到的各種解決方案更簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/371527.html
