如何使用awk分割行(记录)?

如何使用awk分割行(记录)?

文件:

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

相关内容