文件:
data
A B
C D
data
E F
G H
data
I J
K L
M N
想要的结果:
I J
K L
M N
如何按“数据”拆分?我一直在google上搜索如何使用awk,但是大多数相对的awk都是拆分列的。
答案1
用作data
记录分隔符并打印最后一条记录:
$ awk -v RS=data 'END{print}' File
I J
K L
M N
这需要 awk,例如 GNU awk (gawk) 或 mawk,支持 的多字符值RS
。
答案2
$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N
这用于awk
获取以 string 开头的最后一行之后的输入内容data
。这是通过将一行之后的每一行保存到lines
变量中来完成的。每次data
遇到以 开头的行时,该变量都会被清空。当到达输入末尾时,将打印变量的值。
使用sed
:
$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N
我们将所有行添加到保留空间中。当遇到最后一行时,保留空间被交换到模式空间中,并且在打印剩余位之前删除字符串data
(两侧各有一个换行符)之前的所有内容。
使用ed
:
$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N
或者,
ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED
在这里,我们首先向后搜索字符串data
在行开头的最后一次出现,并为该行添加标签(我们称之为标签a
)。然后我们从缓冲区的开头删除到标记行。只是,p
输出缓冲区的全部内容。
对于非 GNU ,可能不需要ed
最后的(退出而不保存)。Q
答案3
要按“数据”而不是换行符分割记录,请设置 RS(记录分隔符)变量。
您只对第四条记录感兴趣(第一条记录在第一个“数据”之前;它是空的),因此仅当 NR 为 4 时才打印。
cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'
答案4
通过以下方法完成,效果很好命令:
tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'
输出
I J
K L
M N