我有一个包含文本数据的文本文件。我想将从 XY: 和 OTP XY: 开始的所有行移至文件顶部。如何在 Bash 中使用 sed、awk 或其他命令来执行此操作?
答案1
使用 GNU ed
(注意:这会file
就地修改;要将编辑后的文件输出到标准输出,请改为更改wq
为,p q
):
printf '%s\n' 'g/^\(\|OTP \)XY:/m0' wq | ed -s file
答案2
使用grep
:
{ grep -E '^(OTP )?XY:' input_file; grep -E -v '^(OTP )?XY:' input_file; } > ouput_file
这 2 个grep
命令input_file
使用不带 ( -v
) 的所需模式来过滤。
将{ ... } > output_file
两个 grep
输出存储到文件中。
答案3
另一种方法可能是使用awk
,例如:
awk -v re='^OTP XY:|^XY:' 'NR==FNR && $0 ~ re; NR!=FNR && $0 !~ re' file file
上面使用单个进程,从不在内存中存储超过一行,但对文件进行两次传递(它读取两次)。
如果两种模式之一在文件中不太可能出现,即小到足以适合 ram,您可以使用如下所示的内容:
awk '/^OTP XY:|^XY:/{print;next} {a = $0 ORS a};END{printf "%s", a}' file
这也使用单个进程,这次对文件进行单次传递,但根据文件的大小/内容,内存使用量可能会增加相当多。