簡體   English   中英

使用grep或awk按列打印數據

[英]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

我可以獲取單個值(使用grepawk ),但是不知道如何以上述格式存儲它們。

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行中的其他分隔符。

我將假設file1中的每個RMAXS值都與file2中的相應順序收斂值相對應,依此類推:

paste <(grep -oP 'RMAXS=\K\S+' file1.dat) \
      <(grep -oP 'convergency[^=]+=\s*\K\S+' file2.dat) | 
sed "$(printf 's#$#\t%s#' "$HOME")"

<(cmd arg ...)語法稱為進程替換 您可以將命令管道視為文件,其他命令可以讀取或寫入文件。 以下是指向pastesedgrepperl正則表達式printf文檔的鏈接

這是一個簡單的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.

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