使用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