[英]How to extract specific value using grep and awk?
我遇到了使用grep和awk在.txt文件中提取特定值的問題。 我在下面顯示.txt文件的摘錄:“-
bravais-lattice index = 2
lattice parameter (alat) = 10.0000 a.u.
unit-cell volume = 250.0000 (a.u.)^3
number of atoms/cell = 2
number of atomic types = 1
number of electrons = 28.00
number of Kohn-Sham states= 18
kinetic-energy cutoff = 60.0000 Ry
charge density cutoff = 300.0000 Ry
convergence threshold = 1.0E-09
mixing beta = 0.7000"
我還定義了一些變量:ELEMENT和lat。 我想提取等於250.00的“單位細胞體積”值。 我嘗試了以下使用grep和awk提取值的方法:
volume=`grep "unit-cell volume" ./latt.10/$ELEMENT.scf.latt_$lat.out | awk '{printf "%15.12f\n",$5}'`
但是,當我運行bash文件時,總是得到00.000000而不是250.00的正確值。
有人可以幫忙嗎? 提前致謝。
awk '{printf "%15.12f\n",$5}'
您要求awk打印出該行的第五個字段( $5
)。
unit-cell volume = 250.0000 (a.u.)^3
1 2 3 4 5
第五個字段是(au)^3
,然后您要求awk通過%f
格式代碼將其解釋為數字。 但是,它不是數字(或者實際上不是以數字開頭),當要求awk將非數字字符串視為數字時,它使用0代替。 因此它打印0。
解決方案:改用$4
。
順便說一句,您可以通過使用awk本身來選擇行來跳過調用grep,例如
awk /^ unit-cell/ {...}
/^ unit-cell/
是一個正則表達式,與該行開頭的“ unit-cell
”(帶有前導空格)匹配。 如果您有其他不想以unit-cell
開頭的行,則可以根據需要進行調整。
使用awk時,您永遠不需要grep,因為awk可以做grep可以做的任何有用的事情。 聽起來這就是您所需要的:
$ awk -F'=' '/unit-cell volume/{printf "%.2f\n",$2}' file
250.00
上面的工作是因為當FS為=
表示$2
是<spaces>250.000 (au)^3
並且當awk被要求將字符串轉換為數字時,它將去掉前導空格和數字部分之后的所有內容,從而使250.000
由%.2f
轉換為數字。
在腳本中,您發布的$5
失敗是因為以下位置的第5個空格分隔的字段:
$1 $2 $3 $4 $5
<unit-cell> <volume> <=> <250.0000> <(a.u.)^3>
是(au)^3
您只需添加print $5
即可看到。
由於您正在處理鍵值對,其中鍵的空間可能有可變的量,因此除非您設置了字段分隔符(FS),否則您需要為要處理的每個記錄分別調整該字段號($ 4,$ 5等)。 )適當地設置為FS=" *= *"
。 那么密鑰將始終在$ 1中,值始終在$ 2中。
然后使用split
將值和單位部分彼此分開。
另外,您可以通過在awk中為該print
操作定義一個模式(或條件, /unit-cell volume/
)來釋放該grep
:
$ awk 'BEGIN{FS=" *= *"} /unit-cell volume/{split($2,a," +");print a[1]}' file
250.0000
解釋:
$ awk '
BEGIN { FS=" *= *" } # set appropriate field separator
/unit-cell volume/ { # pattern or condition
split($2,a," +") # split value part to value and possible unit parts
print a[1] # output value part
}' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.