我有一些格式如下的資料:
2 1 500 500 500
3 1 500 500 500
6 1 500 500 500
8 1 500 500 500
9 1 500 500 500
11 1 500 500 500
12 1 500 500 500
14 1 500 500 500
15 1 500 500 500
16 1 500 500 500
17 1 500 500 500
20 1 500 500 500
21 1 500 500 500
23 1 500 500 500
24 1 500 500 500
25 1 500 500 500
27 1 500 500 500
30 1 500 500 500
31 1 500 500 500
32 1 500 500 500
33 1 500 500 500
34 1 500 500 500
35 1 500 500 500
38 1 500 500 500
40 1 500 500 500
41 1 500 500 500
43 1 500 500 500
44 1 500 500 500
46 1 500 500 500
47 1 500 500 500
我只想在第一列等于 11-40 的行中將 500 值更改為 100。現在我正在做類似的事情:
Numbers=($(seq 11 1 40))
File=filename.txt
for i in ${Numbers[*]}
do
if [ $i == awk '{print $1}' $File ];then
NumberLine=$(grep -n $i $File | cut -d : -f 1)
sed -i "${NumberLine}s/500/100/" $File
fi
done
單獨來看,每一行似乎都在做我想做的事情,但是當我將它們放入回圈中時,我收到以下錯誤:
./changeRestraints.sh: line 5: [: too many arguments
我懷疑這與我的 awk 作為條件陳述句的一部分有關。如何解決此問題以使該腳本運行?
謝謝,
uj5u.com熱心網友回復:
在回圈中反復呼叫awk和提高效率并不是一個好主意。sed請試試:
awk '$1>10 && $1<=40 {gsub(/\<500\>/, "100")} 1' filename.txt
請注意正則運算式\<,并且\>是GNU awk匹配單詞邊界的擴展。
uj5u.com熱心網友回復:
你從來沒有真正執行過awk. 您與$i字串awk進行比較,然后test命令會找到它無法處理的其他引數。因此,您會收到太多引數錯誤。
您需要運行 awk以獲取其輸出,例如通過執行
if [ "$i" = "$(awk ... )" ]
then
...
uj5u.com熱心網友回復:
您也可以使用sed, 模式^(40|[23][0-9]|1[1-9])[[:space:]]匹配數字 11-40,后跟字串開頭的空格。
sed -E '/^(40|[23][0-9]|1[1-9])[[:space:]]/s/500/100/g' file
輸出
2 1 500 500 500
3 1 500 500 500
6 1 500 500 500
8 1 500 500 500
9 1 500 500 500
11 1 100 100 100
12 1 100 100 100
14 1 100 100 100
15 1 100 100 100
16 1 100 100 100
17 1 100 100 100
20 1 100 100 100
21 1 100 100 100
23 1 100 100 100
24 1 100 100 100
25 1 100 100 100
27 1 100 100 100
30 1 100 100 100
31 1 100 100 100
32 1 100 100 100
33 1 100 100 100
34 1 100 100 100
35 1 100 100 100
38 1 100 100 100
40 1 100 100 100
41 1 500 500 500
43 1 500 500 500
44 1 500 500 500
46 1 500 500 500
47 1 500 500 500
uj5u.com熱心網友回復:
在 gawk 中執行此操作的另一種方法:
gawk '$1~/1[1-9]|[23][0-9]|40/{ $3=$4=$5=100 }1' file
當您想維護空間時:
gawk '$1~/1[1-9]|[23][0-9]|40/{ gsub(/\<500\>/,"100") }1' file
uj5u.com熱心網友回復:
用 sed
sed -i '/^11/,/^40/s/500/100/g' filename.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/466758.html
下一篇:在heredocs中轉義的問題
