如何按特定顺序提取行

时间:2018-10-26 02:31:50

标签: bash awk sed grep

我有一个文件:

column1: 23
column2: 42
kolumn3: 24
column1: 24
column2: 35
kolumn3: 46
column1: 25
column2: 42
column1: 35
column2: 45
kolumn3: 52

我希望输出为:

column1: 23
column2: 42
kolumn3: 24
column1: 24
column2: 35
kolumn3: 46
column1: 35
column2: 45
kolumn3: 52

输出必须按column1column2kolumn3顺序进行。删除所有不按此顺序排列的内容。

是否可以在grepsedawk中这样做?

4 个答案:

答案 0 :(得分:3)

使用GNU awk:

awk -v RS='column1: [0-9]+\ncolumn2: [0-9]+\nkolumn3: [0-9]+\n' '{printf RT}' file

记录分隔符RS是设置为捕获3个连续行的正则表达式。

唯一的语句是打印记录终止符RT,而忽略RS未捕获的所有内容。

答案 1 :(得分:2)

这将在awk中解决问题,我们将其称为testcol.awk:

$1=="column1:" {l1=$0; n=2;}
$1=="column2:" && n==2 {l2=$0; n=3;}
$1=="kolumn3:" && n==3 {print l1 "\n" l2 "\n" $0; n=1}

然后运行类似

awk -f testcol.awk your_input_file

答案 2 :(得分:0)

另一个(一个脑虫,在我输入它之前不会让我一个人,虽然还没有经过测试):

$ awk '
BEGIN {
    p="column1:column2:kolumn3:"  # comparison pat- NO, something else ;D
}
p~"^" b $1 {                      # if gathered $1 buffer matches the p
    b=b $1                        # keep collecting
    c=c $0 ORS
    if(p==b) {                    # prefect match deserves to be outputed
        printf c
        b=c=""                    # reset buffer vars
    }
    next                          
}
{                                 # a non-match means a reset and restart 
    b=$1                          # for buffer vars
    c=$0 ORS
}' file

输出:

column1: 23
column2: 42
kolumn3: 24
column1: 24
column2: 35
kolumn3: 46
column1: 35
column2: 45
kolumn3: 52

答案 3 :(得分:0)

这可能对您有用(GNU sed):

sed ':a;N;/^column1:.*\ncolumn2:/!D;N;/\nkolumn3:/b;s/.*\n//;ta' file

将两行读入模式空间,如果它们与column1:后跟column2:不匹配,则删除第一行并重复。否则,添加第三行,如果匹配kolumn3:,则打印所有三行;如果不匹配,则删除前两行,并跳回到sed脚本的开头。

另一种解决方案:

sed -n '/\n/!N;N;/^column1:[^\n]*\ncolumn2:[^\n]*\nkolumn3:[^\n]*$/p;//!D' file