使用grep或awk打印数据列

时间:2013-07-02 14:26:56

标签: awk grep

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

3 个答案:

答案 0 :(得分: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行中的其他分隔符。

答案 1 :(得分: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 ...)语法称为process substitiution。您可以将命令管道视为其他命令可以读取或写入的文件。以下是指向pastesedgrepperl regular expressionsprintf

的文档的链接

答案 2 :(得分: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技巧允许我们在一个过程中完成所有操作,并且恕我直言提高了可读性(一旦你了解它是如何工作的!)