[英]printing data column wise using grep or awk
我有兩個文件要說(file1.dat, file2.dat)
file1.dat contains a line similar to
STR KAPPA2=0 RMAXS=4.2 NDIMIN=0 NOCALC=F IALPHA=0
file2.dat contains
class Fe convergency of s-channel= 0.347E-04
class Sr convergency of s-channel= 0.289E-04
class Bi convergency of s-channel= 0.111E-04
class Pt convergency of s-channel= 0.900E-04
我想要得到的值RMAXS (4.2)
和convergency
,然后在文件中的這些值存儲(say plot)
, column wise
4.2 0.347E-04
4.2 0.289E-04
4.2 0.111E-04
4.2 0.900E-04
我可以獲取單個值(使用grep
和awk
),但是不知道如何以上述格式存儲它們。
Also is there a way to print the shell variables like `$HOME` or
`$PWD` as the third column in the file (plot).
根據您到目前為止提供的信息。 您需要的是echo and grep
請參見以下示例:
我們有兩個文件:f1和f2:
kent$ head f*
==> f1 <==
STR KAPPA2=0 RMAXS=4.2 NDIMIN=0 NOCALC=F IALPHA=0
==> f2 <==
class Sr convergency of s-channel= 0.347E-04
現在執行以下行:
kent$ echo "$(grep -Po '(?<=RMAXS=)[^\s]*' f1)\t$(grep -Po 'channel=\s*\K[^\s]*' f2)\t$PWD" > f3
檢查新生成的文件f3
:
kent$ cat f3
4.2 0.347E-04 /tmp/test
3列用<tab>
分隔。 您可以將其更改為echo
行中的其他分隔符。
這是一個簡單的Awk解決方案。
awk -v h="$HOME" '# From file1.dat, read RMAXS value into r
NR==FNR { if (sub(/.*RMAXS=/,"")) { sub(/ .*/,""); r = $0; } next }
# From file2.dat, print final field along with r and h
/convergency of s-channel=/ { print r, $NF, h }' file1.dat file2.dat >plot
-v var=value
選項允許您從命令行分配任意變量。 在這里,我們使用它來將h
設置為環境變量HOME
的值。
NR
變量跟蹤行號, FNR
變量跟蹤當前文件中的行號。 因此,當您處理第一個文件時, NR==FNR
。 如果找到RMAXS=
,則提取該值並將其分配給r
。 如果文件中還有其他行,則僅跳過它們。
如果失敗了,我們在第二個文件中。 如果一行與convergency
正則表達式匹配,我們將輸出最后一個字段( NF
計算該行上的字段數,默認情況下用空格分隔)以及兩個變量的值。
天真的嘗試將使用一個Awk腳本從第一個文件中提取RMAXS
的值, RMAXS
其作為變量提供給第二個Awk腳本。 NR==FNR
技巧使我們可以在一個過程中完成所有操作,恕我直言提高了可讀性(一旦您了解它是如何工作的!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.