我有两个文件说(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).
答案 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。您可以将命令管道视为其他命令可以读取或写入的文件。以下是指向paste
,sed
,grep
,perl regular expressions和printf
答案 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
技巧允许我们在一个过程中完成所有操作,并且恕我直言提高了可读性(一旦你了解它是如何工作的!)