使用grep或awk按列打印数据

使用grep或awk按列打印数据,awk,grep,Awk,Grep,我有两个文件,它们是(file1.dat,file2.dat) 我想获得RMAXS(4.2)和convergency的值,然后存储这些值 文件中的值(如绘图),列方向 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 `$HO

我有两个文件,它们是
(file1.dat,file2.dat)

我想获得
RMAXS(4.2)
convergency
的值,然后存储这些值 文件中的值<代码>(如绘图),
列方向

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和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

这三列是分开的。您可以在
echo
行中将其更改为其他分隔符。

我将假设文件1中的每个RMAXS值对应于文件2中的相应顺序收敛值,以此类推:

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

paste下面是一个简单的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
regex匹配,我们将打印最后一个字段(
NF
统计行上的字段数,默认情况下以空格分隔)以及两个变量的值


天真的尝试是使用一个Awk脚本从第一个文件中提取
RMAXS
的值,并将其作为变量提供给第二个Awk脚本。
NR==FNR
技巧允许我们在一个过程中完成所有工作,IMHO可以提高可读性(一旦您了解了它的工作原理!)

在文件之间链接记录的关键是什么?@fedorqui:显然这不是一个
join
问题。我假设
file1.dat
file2.dat
是单个实验的输出,整个过程将是运行一系列实验,覆盖相同的文件并从每次运行中提取值。我没有得到正确的输出,它的打印
4.2\t0.347E-04\t/home/surender/garbage
\t
代表一个选项卡;如果您的
echo
不支持反斜杠转义,请将其替换为空格或文本制表符。这正是我想要的,但您能否解释一下语法或指向一些引用。我猜管道后面缺少反斜杠。管道后面不需要反斜杠或
&
|
请在问题中详细说明您的所有要求,不要在注释中分散。
kent$  cat f3
4.2    0.347E-04    /tmp/test
paste <(grep -oP 'RMAXS=\K\S+' file1.dat) \
      <(grep -oP 'convergency[^=]+=\s*\K\S+' file2.dat) | 
sed "$(printf 's#$#\t%s#' "$HOME")"
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