Bash 如何使用grep/awk/sed在分隔符之间隔离文件的一部分,可能会交叉行

Bash 如何使用grep/awk/sed在分隔符之间隔离文件的一部分,可能会交叉行,bash,awk,grep,sh,Bash,Awk,Grep,Sh,我试图使用bash脚本获取输出文件的特定部分,但我不知道如何继续。首先,我需要的数据在 \Hf= 和另一个 \代码>的第一次出现之间。这些值用逗号分隔,但有时中间有行断裂。我需要的是grep所有这些值,并将它们发送到一个只包含它们的新文件中,每行一个 我拥有的输出文件示例如下: ...\HF=-56.876868,-56.2343,-42. 343,-67.3453423,-85.74656,- 45.864\... 我试图使用grep-Pzo,但我不知道如何使用它 如上所述,一个值可以分为两

我试图使用bash脚本获取输出文件的特定部分,但我不知道如何继续。首先,我需要的数据在<代码> \Hf= 和另一个<代码> \代码>的第一次出现之间。这些值用逗号分隔,但有时中间有行断裂。我需要的是
grep
所有这些值,并将它们发送到一个只包含它们的新文件中,每行一个

我拥有的输出文件示例如下:

...\HF=-56.876868,-56.2343,-42.
343,-67.3453423,-85.74656,-
45.864\...
我试图使用grep-Pzo,但我不知道如何使用它

如上所述,一个值可以分为两行:

...-90.80
234,...
必须将其视为相同的数字。有时,只有负号在上面一行,其余数字在下一行:

...,-
56.656,...
输出示例来自:

一个必须是我需要的文件的例子

像这样的

awk -F '\' '!p && $2 ~ /^HF=/ { $1=""; p=$0; next }
    p && NF>1 { p = p $1; print p; p="" }
    p { p = p $0 }' file >newfile
如果我们看到
HF=
,开始将资料收集到
p
。如果设置了
p
,则我们正在收集;继续收集,直到我们看到另一个反斜杠。当我们看到它时,打印收集的
p
,然后用空的
p
重新开始(即,在再次看到下一个开始标记之前,我们不再收集输出)

请注意,这假定一行上的反斜杠不超过一个。如果需要支持,则需要一个稍微复杂一些的脚本。(特别是,您不能信任
$2
包含'HF=,但您必须遍历所有字段并检查哪个字段是实际的开始。)


grep
不适合这种情况,Bash本身也不是特别装备精良。您可以尝试
sed
,但它更像是一种只写的语言,因此很少推荐用于非平凡任务。

sed
解决方案:

sed -En '/\HF/{
s/^.*\HF=//;
:label1
N;
/\\/!{b label1}
N;
s/[[:space:]]+//g;
s/,/\n/g;s/\\.*//gp;
q;
}' file > outfile
输出

-156.0385049
-156.312885
-156.0311709
-156.0310505
-156.0309275
-156.0308023
-156.030548
-156.0304151
-156.0302832
-156.0301504
-156.0300168
-15
8492
84298484.0385128

遗憾:这里硬编码了一个新行:(

在任何UNIX框的任何shell中使用任何awk:

$ awk -v RS='\\' -F, -v OFS='\n' 'sub(/^HF=/,""){gsub(/[[:space:]]+/,""); $1=$1; print}' file
-156.0385049
-156.312885
-156.0311709
-156.0310505
-156.0309275
-156.0308023
-156.030548
-156.0304151
-156.0302832
-156.0301504
-156.0300168
-15
8492
84298484.0385128

示例输入中的最后一个字段似乎不是您所期望的。如果您的awk不支持POSIX字符类,例如nawk,则只需将
[[:space:]
更改为
[\t\n]

请将该示例输入的所需输出添加到您的问题中。是的,但是值是beetween\HF=和一个反斜杠\另外,您是否有理由不使用,比如说,
tr-d'\r\n'
来彻底消除换行符?我使用的是:sed-z's/\n//g'gaussian.log | grep-Po'\\HF=\K[^\]*“|tr”,“\n'>我需要的文件”\u.out我很抱歉,我的错。我打开了一个旧版本的输出,我创建的名称彼此相似。现在它已经100%正常工作了。非常感谢您的帮助。ween\HF=和\只有数字和逗号。有趣的问题是,前后是否可以有额外的反斜杠,但是在同一行。哦,可能有。GAUSSIAN的输出格式不好。你在问题中根本没有提到这个工具,所以我认为你把标签放错了。这是关于一个数学概念,而不是一个特定的工具。也许你想用一个链接更新你的问题,以获得关于这个特定工具的更多信息。GAUSSIAN是一个计算化学软件。在这种情况下不是高斯正态分布distribution@vintnes为字段分配任何内容都会导致使用字段之间的OFS值重建记录。因此,如果您只想用OFS替换所有FSs,请为其自身分配一个字段。请尝试
echo'a,b'| awk-F,-v OFS='#“{print;$1=$1;print NF,$0}'
。因此在上面的代码中,我在整个记录中将
s替换为
\n
s,就像我编写
gsub(/,/,“\n”)一样
但不需要像后者那样重新拆分为字段。比较
echo'a,b'| awk-F,-v of s=''{print;gsub(/,/,“#”);print NF,$0}输出中的前一个NF和NF。
-156.0385049
-156.312885
-156.0311709
-156.0310505
-156.0309275
-156.0308023
-156.030548
-156.0304151
-156.0302832
-156.0301504
-156.0300168
-15
8492
84298484.0385128
$ awk -v RS='\\' -F, -v OFS='\n' 'sub(/^HF=/,""){gsub(/[[:space:]]+/,""); $1=$1; print}' file
-156.0385049
-156.312885
-156.0311709
-156.0310505
-156.0309275
-156.0308023
-156.030548
-156.0304151
-156.0302832
-156.0301504
-156.0300168
-15
8492
84298484.0385128