0

我有两个文件说(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

我可以获得单个值(使用grepand awk),但不知道如何以上述格式存储它们。

Also is there a way to print the shell variables like `$HOME` or
`$PWD` as the third column in the file (plot).
4

3 回答 3

0

根据您迄今为止提供的信息。你需要的是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

于 2013-07-02T14:40:24.047 回答
0

我将假设 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 ...)语法称为进程替换。您可以将命令管道视为其他命令可以读取或写入的文件。以下是指向paste, sed, grep, perl 正则表达式printf

于 2013-07-02T15:24:22.840 回答
0

这是一个简单的 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并将其作为变量提供给第二个 Awk 脚本。这个NR==FNR技巧允许我们在一个过程中完成所有操作,恕我直言,提高了可读性(一旦你了解它是如何工作的!)

于 2013-07-04T03:46:01.817 回答