Bash 如何搜索可能跨越或不跨越两行的字符串?
所以我试图收集字符串后的一系列数字。但是,字符串在我正在排序的文本块中的位置可能会发生很大变化 以下是我目前正在使用的完整代码:Bash 如何搜索可能跨越或不跨越两行的字符串?,bash,search,grep,line,cut,Bash,Search,Grep,Line,Cut,所以我试图收集字符串后的一系列数字。但是,字符串在我正在排序的文本块中的位置可能会发生很大变化 以下是我目前正在使用的完整代码: echo name HF MP2 | cat > allE for i in *.out do grep "Slide" $i | cut -d "\\" -f2 | cat | tr -d '\n' > $i.name && grep "EUMP2" $i | cut -d "=" -f3 | cut -c 1-25
echo name HF MP2 | cat > allE
for i in *.out
do grep "Slide" $i | cut -d "\\" -f2 | cat | tr -d '\n' > $i.name &&
grep "EUMP2" $i | cut -d "=" -f3 | cut -c 1-25 | tr '\n' ' ' >> $i.mp2 &&
grep 'AG\\HF' $i | cut -d "=" -f3 | cut -c 1-13 | tr '\n' ' ' >> $i.hf &&
paste $i.name >> $i.energies &&
paste $i.hf >> $i.energies &&
sed -i 's/[ABCEFGHIJKLMNOPQRSTUVWXYZ]//g' $i.mp2 &&
paste $i.mp2 >> $i.energies &&
transpose $i.energies >> $i.allE #temp.txt &&
#cat temp.txt > $i.energies
#echo $i is finished
done
echo see allE for energies
rm *.energies #temp.txt
rm *.name
rm *.mp2
我正在搜索的字符串是AG\HF。
问题是它正在搜索的数据可能看起来像(注意:此数据中有实际的新行字符,我认为这是造成问题的原因)
或
或
或
以及其他几种可能的组合。目前,我使用grep和a=作为分隔符,这在60%的时间内都有效。 grep是这样写的:
grep 'AG\\HF' $i | cut -d "=" -f3 | cut -c 1-13 | tr '\n' ' ' >> $i.hf
这个grep将在同一个文件中发生多次
如有任何建议能使所需13个字符的收集保持一致,我们将不胜感激
最终结果应该如下所示:
-461.4440942 -461.4441024 -461.4441114 -461.4441212 -461.4441321 -461.4441575 -461.4441725 -461.4441893 -461.444208 -461.4442289 -461.4442522 -461.444278 -461.4443063 -461.4443371 -461.4444054 -461.4444421 -461.4444798 -461.4445175 -461.4445544 -461.4445891
我实际得到的是期望输出和以下内容的组合:
-461.4417716\ -461.4413023\ 1-AG\HF -461.439848\M -461.4387568\ -461.4373225\ -461.4354367\ -461.4329522\ -461.4296709\ -461.4253285\ -461.419576\M -461.4119582\ 1-AG\HF -461.4432257\ -461.4431843\ -461.4431419\ -461.443098\M -461.4430519\ 1-AG\HF -461.4429461\ -461.4428799\ -461.4427974\ -461.4426902\ -461.4425469\ -461.4423525\ -461.4420882\ -461.4417302\ -461.4412489\ 1-AG\HF -461.439758\M -461.4386392\ -461.4371684\ -461.4352341\ -461.4326853\ -461.4293183\ -461.4248614\ -461.4189557\ -461.411132\M 1-AG\HF -461.4432226\ -461.443181\M -461.4431381\ -461.4430938\ -461.4430472\ 1-AG\HF -461.4429401\ -461.4428728\ -461.4427889\ -461.44268\MP -461.4425343\ -461.4423369\ -461.4420684\ -461.4417048\ -461.4412162\ 1-AG\HF -461.4397026\ -461.4385667\ -461.4370734\ -461.4351091\ -461.4325204\ -461.4291001\ -461.424572\M -461.4185707\ -461.4106184\ 1-AG\HF -461.4432215\ -461.4431798\ -461.4431369\ -461.4430924\ -461.4430457\ 1-AG\HF -461.442938\M -461.4428704\ -461.4427861\ -461.4426766\ -461.4425301\ -461.4423316\ -461.4420617\ -461.4416963\ -461.4412051\ 1-AG\HF -461.4396839\ -461.4385423\ -461.4370413\ -461.4350669\ -461.4324646\ -461.4290263\ -461.4244739\ -461.4184402\ -461.4104442\ 1-AG\HF
使用线路
awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' $i >> $i.hf &&
所有这些都是产出
-4 -4 -4
您可以使用此单一的
awk
:
awk -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file
要在单行中获取输出,请执行以下操作:
awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file
请为每个示例输入添加您的预期输出。您的实际输出是什么?它与预期输出有何不同?记录的长度是否相同?(即,是否可以以XXX个字符的块而不是行处理文件)。数据中是否总是有开始哨兵和结束哨兵?它们不总是相同的长度,感兴趣的值也不总是出现在同一行上。现在,每组数据(长度可变的行数)以
1\1\GINC
开头,以\\@
@Yes结尾。我已经让脚本遍历并删除换行符,如果它正在分解所需的文本。然后我调用HF作为分隔符并收集字符。$3和$4的定义是什么?我对awk不太熟悉。不幸的是,这比我使用的原始grep命令的效果还要差。$n
是awk中由=
分隔的n
字段
awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' $i >> $i.hf &&
-4 -4 -4
awk -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file
-461.3998608
-461.4104442
-461.4440942
-461.4441483
awk -v ORS=' ' -F= '$3 ~ /AG\\HF$/{print substr($4, 1, 12)}' file