簡體   English   中英

如何使用grep和awk提取特定值?

[英]How to extract specific value using grep and awk?

我遇到了使用grepawk在.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM