我有一个文件:
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
输出必须按column1
,column2
,kolumn3
顺序进行。删除所有不按此顺序排列的内容。
是否可以在grep
,sed
或awk
中这样做?
答案 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