如何基于换行分割文件并在分割后仅获取文件中的第二个字段

如何基于换行分割文件并在分割后仅获取文件中的第二个字段

下面的示例文本文件:

#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

我会做什么,与在ecord eparator\n\n的支持下并且:RSgensub()

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

该块可以位于输入中的任何位置。

相关内容