我正在尝试使用bash脚本进行后期处理。其中一个步骤是从文件的某些行以下的行复制到另一个文件。例如,我的文件result.txt看起来像这样
6798
Atoms. Timestep: 0
1 -1.13977 -2.85824 -1.22655
1 -1.20925 -3.25439 -0.978641
1 -1.54565 -2.93301 -1.10555
1 -0.736167 -2.71201 -1.28063
1 -0.807178 -3.16856 -1.13489
1 -0.44354 -3.03183 -1.23103
1 -0.357782 -3.39866 -1.0277
1 -0.0431648 -3.05734 -1.23315
6798
Atoms. Timestep: 1
1 0.119814 -3.40483 -1.03653
1 0.382198 -3.03771 -1.23183
1 0.580509 -3.37434 -1.02215
1 0.818628 -3.00063 -1.21422
1 1.0244 -3.31469 -0.980957
1 1.27482 -2.97232 -1.15564
我只想要Atoms. Timestep: 1
以下的部分。手动完成它非常容易,但是,有成千上万的这样的文件,所以我想使用bash脚本为我完成它。我从谷歌检查了几种方法,但是,它们不适合我的问题。如果你有这样的经验,最好把你的结果贴在下面。这可能对其他和我有类似问题的人有所帮助。
提前感谢!
最终解决
我的最终解决方案是,正如下面提到的,我得出一个结论。
sed -n '/Atoms. Timestep: 1/, $ p' < result.txt > resultParsed.txt
sed -i '/Atoms. Timestep: 1/d' resultParsed.txt
第一行将获得包含Atoms及其之后的内容。步伐:1。第二行将删除您不需要的行。
这将从result.txt复制,从第一个匹配到文件末尾,并保存在 resultparse .txt:
sed -n '/Atoms. Timestep: 1/, $ p' < result.txt > resultParsed.txt
这将从result.txt复制第一个匹配项和接下来的6个条目,并保存在 resultparse .txt:
sed -n '/Atoms. Timestep: 1/ , +6 p' < result.txt > resultParsed.txt
环境:GNU sed version 4.1.5
使用awk
awk 'x+=/Atoms. Timestep: 1/' file >newfile
当找到该字符串时,将x加1,然后x大于0,这被视为true, awk的默认操作是打印。因此,包括这一行在内的所有行都将被打印。