在busybox(ash)裡不一樣的awk結果 [論壇 - Ubuntu 程式設計]
正在瀏覽:
1 名遊客
在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2010/6/21 16:38 所屬群組:
已註冊使用者 等級: 2
HP : 0 / 25
![]() |
有一個file內容如下:
# cat table 一個script如下: # cat test.sh 執行結果: # ./test.sh 同樣的awk搜尋方式,為何出來的結果不一樣? Test1會自動轉成十進位,但Test2仍然保持原本的 是因為 read 的關係嗎? 在沒有support bc的前提下,要如何做才能讓 Test1 的結果跟table內容一樣?
2015/5/21 10:41
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員五級
![]() ![]() 註冊日期:
2012/4/22 10:50 所屬群組:
已註冊使用者 等級: 36
HP : 179 / 895
![]() |
DJW 寫到: 試試看下面的程式,看看行不行得通
或是簡化版本
更改權限
執行
會顯示下面的結果
剛剛去翻之前的「討論」,還有查詢「awk 16进制转10进制」,查到「一篇」,就湊出上面的程式碼了。 ![]() 另外你使用的busybox的版本是? ## 更多參考 $ man awk 可以看到一段
2015/5/21 13:46
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2010/6/21 16:38 所屬群組:
已註冊使用者 等級: 2
HP : 0 / 25
![]() |
結果仍是不如預期, busybox版本是v1.13.2
Test2的做法跟Test1的awk方法是一模一樣的 兩個差別只在Test1會將結果透過read的方式寫進變數,然後才印出來 所以目前是認為問題點不在awk 從Test2的結果可以知道這個指令 echo $line|awk '{print $1,$2,$3}' 的執行結果是會跟檔案的內容一樣 Test1也是用同一個指令,然後再將結果透過read把這個結果寫進變數 不過把變數印出時,卻不一樣了
2015/5/21 14:45
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員五級
![]() ![]() 註冊日期:
2012/4/22 10:50 所屬群組:
已註冊使用者 等級: 36
HP : 179 / 895
![]() |
DJW 寫到: 我用bash執行你貼出來的程式碼 顯示的結果如下
關於
awk本來就是把欄位拆開(空白分隔),然後如實的印出來,並沒有自動去幫你做轉換。 awk會做轉換,要用printf("%d", $1),或是內建的function,例如 strtonum,來作轉換 。 改寫你的程式碼
用bash執行後,顯示
另外,我還沒研究read會做什麼動作,是否會將字串轉成數值。(看起來不是這個問題,請看下面回覆) 也還沒用「busybox版本是v1.13.2」,來測試我剛回覆你的程式碼, 因為還沒去建立「busybox版本是v1.13.2」的環境, 可以請教一下你怎麼建立那個環境的嗎?這個我就不會了 Orz... 所以再次跟你確認一下,你有用「busybox版本是v1.13.2」來測試我剛剛貼的程式碼了嗎?
2015/5/21 15:23
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員五級
![]() ![]() 註冊日期:
2012/4/22 10:50 所屬群組:
已註冊使用者 等級: 36
HP : 179 / 895
![]() |
再改寫你的程式碼
一樣用bash執行,顯示
注意,下面這一段,我用原來的「line」,並沒有使用「awk」產生新的內容。
所以應該要研究read和here-document會做什麼動作(我還在看manual)。(看起來不是這個問題,請看下面回覆) 另外確認一下,你的需求 你要的是用「read」的方式,然後要顯示跟原來的table一樣嗎? DJW 寫到: 因為我本來以為你的需求,你是要將第一個欄位,從16進位轉成10進位。 所以我才給你一開始回覆你的「那段程式碼」。 我仔細想了一下,若是要一樣,不做轉換,應該就不需要做任何動作,直接cat出來就好。 所以,猜測你的想法, 你是要透過read來獲取每個欄位,存到三個變數去,然後做處理。 然後第一個變數,應該是被自動轉換了,所以就無法如你預期的了。 若是如此的話,應該可以使用awk來做吧?
或是像我一開始貼的,直接在awk裡面做好你要的輸出。
以上釐清 ![]()
2015/5/21 16:14
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員五級
![]() ![]() 註冊日期:
2012/4/22 10:50 所屬群組:
已註冊使用者 等級: 36
HP : 179 / 895
![]() |
## 測試檔案,檔名「table」
內容如下
==================================================================== 剛又仔細看了一下你的程式碼,和做了一些「read」和「here-document」的測試, 突然想到一件事情,大概猜的出來癥結點在哪了 癥結點跟「awk」,「read」,「here-document」都無關,而是跟「expansion」有關 所以只要改成下面的程式碼就會正常了
顯示
上面的程式也可以簡化成
==================================================================== 你原來程式的邏輯,應該是「Arithmetic Expansion」, 而不是你原來預期的「indirect expansion」或是「variable indirection」。
顯示
或是執行
顯示
參考資料 執行 $ man bash 查詢「Arithmetic Expansion」,可以看到下面這一段
或是執行 $ man sh 查詢「Arithmetic Expansion」,可以看到下面這一段
==================================================================== ## 小結 原本你想要的,應該是類似「php Variable variables」, 後來查到的資料,術語應該是「Indirect Expansion」或是「Variable Indirection」或是「Indirect References」。 不過你的需求,我認為應該可以用這篇回覆,最上面的作法去做,就行了。 而且「dash」,「ash」,「bash」,「zsh」都能執行。 查詢了一下「variable variable bash」,查到「一篇」,了解到bash的語法是「${!variable}」。 若是「bash」的話 簡單範例如下
或是
會顯示
換成你的例子
就會顯示
所以你原來的程式碼
就可以改成
或是簡化成
上面這個方式也只能在bash執行。 參考資料 $ man bash 查詢「indirect expansion」或是「Parameter Expansion」 就可以看到一段
==================================================================== 另外查詢「sh variable indirection」,可以看到「這篇」,「這篇」,「這篇」,「這篇」 原理如下 執行
顯示
執行
顯示
執行
顯示
執行
顯示
執行
顯示
綜合以上 簡單範例如下
或是
或是
或是
會顯示
所以你的程式碼,可以改成下面的寫法,只要符合POSIX-features的shell都可以執行, 你可以用「bash」,「dash」,「ash」,「zsh」來測。
或是
或是
或是
同樣的,上面也可以簡化成下面的寫法
或是
或是
或是
==================================================================== 若是bash,也可以用下面陣列的寫法
上面的程式可以簡化成下面的寫法
參考資料 $ man bash 查詢「Arrays」 就可以看到一段
==================================================================== ## 更多參考資料 $ man bash 查詢「here-document」 -------------------------------------------------- $ man sh 查詢「here-document」 -------------------------------------------------- $ man bash 查詢「SHELL BUILTIN COMMANDS」 往下找 會看到
執行 $ type read 就會看到
所以執行下面的指令,就會看到「read」的說明文件 $ help read -------------------------------------------------- $ man bash 查詢「Command Substitution」 $ man sh 查詢「Command Substitution」 -------------------------------------------------- ![]()
2015/5/21 17:37
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2010/6/21 16:38 所屬群組:
已註冊使用者 等級: 2
HP : 0 / 25
![]() |
感謝你的幫忙,原來想的方向錯了
另外再請教一個問題,search string的指令哪邊有問題呢? # cat test.sh # cat number string # ./test.sh number string
2015/5/22 11:08
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員五級
![]() ![]() 註冊日期:
2012/4/22 10:50 所屬群組:
已註冊使用者 等級: 36
HP : 179 / 895
![]() |
DJW 寫到: 哇,你在考我的頭腦阿,我的頭腦太老舊了,無法處理這麼複雜的運算。 我上面只是告訴你,有「variable indirection」這樣的用法。 除非必要,否則基本上不建議去用它拉, 因為程式碼會一層包一層,就會顯得不好閱讀,又不好除錯。 又不是在玩指標的指標,還是template,呵呵。 應該不用這麼自虐,這樣折騰自己吧... 好拉,開玩笑的,我一時,也看不出來你上面哪邊出了錯, 可能需要花點時間慢慢拆解。這個我就暫時不花時間在上面了。 我頭殼裡面的CPU真的太老舊了。 我先寫了下面簡單版的,也是我上面回覆,一開始建議你的寫法。 不過我不確定你的需求是不是要這樣做,你在根據你自己的需求修改吧。 ## 檔案「string」
## 檔案「number」
## 檔案 「test.sh」
執行
顯示
2015/5/22 13:42
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2010/6/21 16:38 所屬群組:
已註冊使用者 等級: 2
HP : 0 / 25
![]() |
好,我會從這方向去思考的
會這樣用的原因主要是因為table的內容實際上有幾十行,每一行有10幾個數值需存進變數 所有的變數在while loop結束後都還要拿出來做特定的處理 所以事實上我會需要幾百個變數來存table裡的值 為了不讓程式變的太冗長,所以才沒有照你的建議去使用變數 還是很謝謝你的幫忙
2015/5/22 15:17
|
||||||||||
![]() |
回覆: 在busybox(ash)裡不一樣的awk結果 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員五級
![]() ![]() 註冊日期:
2012/4/22 10:50 所屬群組:
已註冊使用者 等級: 36
HP : 179 / 895
![]() |
DJW 寫到: 我大概猜的出來,為啥你堅持要這樣做。 像這樣複雜的資料結構,我就會用PHP處理了。 不過你這個script要執行,環境應該是在busybox。 所以應該也無法使用PHP。 另外先給你一個方向,下面的方式,不會是你預期的
就會顯示
這跟你剛剛的程式錯誤的地方是一樣的 剛測試了一下
就會顯示
還在研究怎麼改寫你的程式 ![]() 另外突然想到,你的環境,可以用awk來處理吧,用awk也許可以做到你的需求。 不過不是很了解你的需求,所以提出來當參考摟。
2015/5/22 15:57
|
||||||||||
![]() |
您可以查看帖子.
您不可發帖.
您不可回覆.
您不可編輯自己的帖子.
您不可刪除自己的帖子.
您不可發起投票調查.
您不可在投票調查中投票.
您不可上傳附件.
您不可不經審核直接發帖.