這是我的原始檔案:
#Game No : 1000693
***** 888poker Hand History for Game 1000693 *****
$1/$2 Blinds No Limit Holdem - *** 18 11 2021 10:41:44
Table DD Poker 9 Max (Real Money)
Seat 7 is the button
Total number of players : 9
Seat 1: Monroe ( $2 )
Seat 2: Mpeti ( $2 )
Seat 3: Bowen ( $2 )
Seat 4: Riccardo ( $2 )
Seat 5: Ramman ( $2 )
Seat 6: Reva ( $2 )
Seat 7: Miklos ( $2 )
Seat 9: Samlet ( $2 )
Seat 10: Geralyn ( $2 )
Hamlet posts small blind [$1]
Geralyn posts big blind [$2]
** Dealing down cards **
Monroe calls [$2]
Mpeti folds
Bowen folds
Riccardo folds
Ramman folds
Reva folds
Miklos calls [$2]
Hamlet folds
** Dealing flop ** [ As, 6s, Ah ]
** Dealing turn ** [ 8s ]
** Dealing river ** [ 4h ]
** Summary **
Monroe shows [ Jh, Td ]
Miklos shows [ Tc, Jc ]
Samlet shows [ Th, 8c ]
Geralyn shows [ Js, Ts ]
Geralyn collected [ $17 ]
對于所有美元值“$X”,我需要將它們替換為“$X/10”(Eks. $2/10=0.2),我可以使用以下管道命令提取美元值并將它們除以 10:
grep -o '\$[[:digit:]]*' dollar.txt | sed 's/[^0-9]//g' | awk '{print $1/10}'
0.1
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.2
0.1
0.2
0.2
0.2
如何更改整個原始檔案(或創建一個新檔案),以便檔案的其余部分包含所有“$X”值都替換為“$X/10”?
uj5u.com熱心網友回復:
如果您可以perl為此使用,則解決方案將很短
perl -i -pe 's{\$(\d )}{($1/10)}ge' file
請參閱在線演示。詳情:
-i- 行內檔案更改選項s{\$(\d )}{($1/10)}ge-s替換命令,其中 RHS(替換部分)是 Perl 運算式(通過e標志啟用),匹配符號g每一行上的所有 ( ) 出現$,然后匹配一個或多個數字(捕獲到組 1,$1),并用第 1 組值除以 10 的結果替換每個匹配項。
如果您想明確禁止執行浮點值的替換(例如在 中$10.500),您可以替換\$(\d )為\$(\d )(?!\.?\d)。
uj5u.com熱心網友回復:
作為純 awk 腳本(不需要 bash)的一種實作可能如下所示:
#!/usr/bin/env awk -f
/[$][[:digit:]] / {
while (match($0, /[$][[:digit:]] /) > 0) {
prefix = substr($0, 1, RSTART-1)
suffix = substr($0, RSTART RLENGTH)
input = substr($0, RSTART 1, RLENGTH-1)
output = input / 10
$0 = prefix output suffix
}
}
{ print }
如果使用./awkscript <in.txt或運行awk -f awkscript <in.txt,輸出為:
#Game No : 1000693
***** 888poker Hand History for Game 1000693 *****
0.1/0.2 Blinds No Limit Holdem - *** 18 11 2021 10:41:44
Table DD Poker 9 Max (Real Money)
Seat 7 is the button
Total number of players : 9
Seat 1: Monroe ( 0.2 )
Seat 2: Mpeti ( 0.2 )
Seat 3: Bowen ( 0.2 )
Seat 4: Riccardo ( 0.2 )
Seat 5: Ramman ( 0.2 )
Seat 6: Reva ( 0.2 )
Seat 7: Miklos ( 0.2 )
Seat 9: Samlet ( 0.2 )
Seat 10: Geralyn ( 0.2 )
Hamlet posts small blind [0.1]
Geralyn posts big blind [0.2]
** Dealing down cards **
Monroe calls [0.2]
Mpeti folds
Bowen folds
Riccardo folds
Ramman folds
Reva folds
Miklos calls [0.2]
Hamlet folds
** Dealing flop ** [ As, 6s, Ah ]
** Dealing turn ** [ 8s ]
** Dealing river ** [ 4h ]
** Summary **
Monroe shows [ Jh, Td ]
Miklos shows [ Tc, Jc ]
Samlet shows [ Th, 8c ]
Geralyn shows [ Js, Ts ]
Geralyn collected [ 1.7 ]
uj5u.com熱心網友回復:
我將AWK按照以下方式使用 GNU完成此任務,讓file.txt內容成為
#Game No : 1000693
***** 888poker Hand History for Game 1000693 *****
$1/$2 Blinds No Limit Holdem - *** 18 11 2021 10:41:44
Table DD Poker 9 Max (Real Money)
Seat 7 is the button
Total number of players : 9
Seat 1: Monroe ( $2 )
Seat 2: Mpeti ( $2 )
Seat 3: Bowen ( $2 )
Seat 4: Riccardo ( $2 )
Seat 5: Ramman ( $2 )
Seat 6: Reva ( $2 )
Seat 7: Miklos ( $2 )
Seat 9: Samlet ( $2 )
Seat 10: Geralyn ( $2 )
Hamlet posts small blind [$1]
Geralyn posts big blind [$2]
** Dealing down cards **
Monroe calls [$2]
Mpeti folds
Bowen folds
Riccardo folds
Ramman folds
Reva folds
Miklos calls [$2]
Hamlet folds
** Dealing flop ** [ As, 6s, Ah ]
** Dealing turn ** [ 8s ]
** Dealing river ** [ 4h ]
** Summary **
Monroe shows [ Jh, Td ]
Miklos shows [ Tc, Jc ]
Samlet shows [ Th, 8c ]
Geralyn shows [ Js, Ts ]
Geralyn collected [ $17 ]
然后
awk 'BEGIN{FPAT="[^0-9]|([0-9]*)";OFS=""}{dollar=0;for(i=1;i<=NF;i =1){if(dollar){$i*=0.1};dollar=($i=="$")};print}' file.txt
輸出
#Game No : 1000693
***** 888poker Hand History for Game 1000693 *****
$0.1/$0.2 Blinds No Limit Holdem - *** 18 11 2021 10:41:44
Table DD Poker 9 Max (Real Money)
Seat 7 is the button
Total number of players : 9
Seat 1: Monroe ( $0.2 )
Seat 2: Mpeti ( $0.2 )
Seat 3: Bowen ( $0.2 )
Seat 4: Riccardo ( $0.2 )
Seat 5: Ramman ( $0.2 )
Seat 6: Reva ( $0.2 )
Seat 7: Miklos ( $0.2 )
Seat 9: Samlet ( $0.2 )
Seat 10: Geralyn ( $0.2 )
Hamlet posts small blind [$0.1]
Geralyn posts big blind [$0.2]
** Dealing down cards **
Monroe calls [$0.2]
Mpeti folds
Bowen folds
Riccardo folds
Ramman folds
Reva folds
Miklos calls [$0.2]
Hamlet folds
** Dealing flop ** [ As, 6s, Ah ]
** Dealing turn ** [ 8s ]
** Dealing river ** [ 4h ]
** Summary **
Monroe shows [ Jh, Td ]
Miklos shows [ Tc, Jc ]
Samlet shows [ Th, 8c ]
Geralyn shows [ Js, Ts ]
Geralyn collected [ $1.7 ]
解釋:我AWK使用FPAT. 然后我使用for回圈遍歷欄位,首先,如果dollar變數為真,我將欄位替換為 0.1 的值,然后dollar如果欄位等于 ,則將變數設定為真$。順序至關重要,因為這意味著第一個操作是在美元欄位之后立即欄位。處理完所有欄位后我print就行了。我將輸出欄位分隔符 ( OFS) 設定為空字串,以防止注入不需要的字符。
(在 GNU Awk 5.0.1 中測驗)
uj5u.com熱心網友回復:
如果.2足夠0.2,您可以在每個美元價值的最后一位數字前加一個點:
sed -E 's/(\$)([0-9]*)([0-9])/\2.\3/g
否則(改進,感謝potong的建議):
sed -E '
s/\$([0-9] )([0-9])/\1.\2/g
s/\$([0-9])/0.\1/g' file
- 對于包含兩位或更多位數字的美元值,
$在最后一位數字之前洗掉并放置一個點(有效地除以 10)。 - 任何剩余的美元價值都有一位數。洗掉
$, 并放在0.數字之前。 - 如果輸入可以包含十進制美元值,這將不起作用(例如
$10.00)
uj5u.com熱心網友回復:
使用 GNU awk 進行“就地”編輯和第三個引數match():
$ awk -i inplace 'match($0,/(.*\$)([0-9] )(.*)/,a){ $0=a[1] a[2]/10 a[3] } 1' file
$ cat file
#Game No : 1000693
***** 888poker Hand History for Game 1000693 *****
$1/$0.2 Blinds No Limit Holdem - *** 18 11 2021 10:41:44
Table DD Poker 9 Max (Real Money)
Seat 7 is the button
Total number of players : 9
Seat 1: Monroe ( $0.2 )
Seat 2: Mpeti ( $0.2 )
Seat 3: Bowen ( $0.2 )
Seat 4: Riccardo ( $0.2 )
Seat 5: Ramman ( $0.2 )
Seat 6: Reva ( $0.2 )
Seat 7: Miklos ( $0.2 )
Seat 9: Samlet ( $0.2 )
Seat 10: Geralyn ( $0.2 )
Hamlet posts small blind [$0.1]
Geralyn posts big blind [$0.2]
** Dealing down cards **
Monroe calls [$0.2]
Mpeti folds
Bowen folds
Riccardo folds
Ramman folds
Reva folds
Miklos calls [$0.2]
Hamlet folds
** Dealing flop ** [ As, 6s, Ah ]
** Dealing turn ** [ 8s ]
** Dealing river ** [ 4h ]
** Summary **
Monroe shows [ Jh, Td ]
Miklos shows [ Tc, Jc ]
Samlet shows [ Th, 8c ]
Geralyn shows [ Js, Ts ]
Geralyn collected [ $1.7 ]
如果你想$從輸出除去當時的只是改變\$)以)\$在使用正則運算式match()。
以上假設您$<number>每行只有 0 或 1個,并且所有數字都是整數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/362993.html
