下面的示例文本文件:
#This is a sample file
## version 3.0
- change 1
- change 2
## version 2.5
- change 1
- change 2
- change 3
## version 2.4
- change 1
- change 2
我只是在该文件的最新更改之后,该文件位于顶部,如下所示。
## version 3.0
- change 1
- change 2
我能够创建以下命令:
awk -v RS= '{print > ("filename" NR ".txt")}' sample.txt
但我不想创建所有文件。只需一会儿即可获得我需要的内容。
答案1
使用任何 awk:
$ awk -v RS= '/\n-/{print; exit}' sample.txt
## version 3.0
- change 1
- change 2
只需将该输出重定向到一个文件,没有理由让 awk 生成一个子 shell 来创建输出文件,就像您在问题的代码中所做的那样,只需让 shell 在调用 awk 时执行此操作:
awk -v RS= '/\n-/{print; exit}' sample.txt > output.txt
如果还不够的话,请更改/\n-/
为/^## version/
或NR > 1
或任何您需要的内容,以将版本块与主要注释分开。/\n-/
答案2
我会做什么,与awk在ecord eparator\n\n
的支持下并且:R
S
gensub()
awk '
BEGIN{RS="\n\n"}
{
v=gensub(/## version ([0-9\.]+)/, "\\1", "1")
v=v+0 # numeric cast
if (v > max) {
max=v
arr[v]=$0
}
}
END{print arr[max]}
' file
## version 3.0
- change 1
- change 2
该块可以位于输入中的任何位置。该解决方案不依赖于块的顺序
答案3
如果珀尔允许(可移植性):
perl -00 -ne '
BEGIN{our $max = 0, %h}
my ($v) = /## version ([\d\.]+)/;
if ($v > $max) {$max=$v; $h{$v}=$_}
END{print $h{$max}}
' file
该块可以位于输入中的任何位置。