我有一个非常长的文件,周期性结构(三个点类似于行数不一定相等,n只是一个索引):
...
string bar text1 (n-2)
...
string bar text1 (n-1)
...
string bar text1 (n)
...
STRING FOO
elements1
elements1
...
string bar text2 (n-2)
...
string bar text2 (n-1)
...
string bar text2 (n)
...
STRING FOO
elements2
elements2
...
我正在尝试制作一个bash脚本来解析这个文件,并在其他文件中打印以下信息:查找STRING FOO
的所有外观并打印到新文件elements
(可以例如,两个加上string bar n
。为了实现这一点,我尝试了以下命令:
grep -A 2 "STRING FOO" input_file.txt >> output_file.txt
grep -B 200 "STRING FOO" input_file.txt | tac | sed -n '/'string bar n'/ { p ; q }' >> output_file.txt
预期产出:
STRING FOO
elements1
elements1
string bar text1
STRING FOO
elements2
elements2
string bar text2
数字200只是一个"猜测"我需要回去多少行。除了低效之外,这些命令无法正常工作。我真的很感激别人的帮助。
答案 0 :(得分:2)
您可以在一个 gung-ho Awk
命令中使用此功能,为此,
awk '/string bar/{ pat=$0; }/\<STRING FOO\>/{c=NR+2}(NR<=c){print}(NR==c){print pat}' file
,只根据需要输出以下行,
STRING FOO
elements1
elements1
string bar text1 (n)
STRING FOO
elements2
elements2
string bar text2 (n)
答案 1 :(得分:1)
$ sed -n '/string bar/h;/STRING FOO/{N;N;x;H;g;p}' in.txt
输出:
STRING FOO
elements1
elements1
string bar text1 (n)
STRING FOO
elements2
elements2
string bar text2 (n)
-n
表示“默认情况下不打印输出。可以通过命令p
进行打印。/string bar/h
- 当找到字符串“string bar”时,将(命令h
)保留在保持缓冲区中。/STRING FOO/{ .. }
- 当找到字符串“STRING FOO”时,在括号内执行命令。N;N
- 将下一行(命令N
)两行添加到当前一行(即“STRING FOO”+两行“元素”)。x
- 交换保持和模式缓冲区。现在保持缓冲区3行“STRING FOO”和两个“元素”。
并在当前模式缓冲区“字符串栏”。H
- 追加当前行以保留缓冲区。g
- 从保持缓冲区获取字符串到当前模式空间。p
- 从当前模式空间打印行。答案 2 :(得分:1)
使用:
grep "STRING FOO\|string bar" file.out | grep -B 1 STRING FOO | head -n 1
您将获得"string bar text1 (n)"
为你的&#34;元素&#34;重复相同的逻辑。
此致。