awk-打印RS前的数据,同一行

awk-打印RS前的数据,同一行,awk,Awk,我有一个输出,我正在通过管道传输到awk,在一些行的末尾发现了一个好的RS字符串。 但当我将尾部字符串定义为RS时,awk只删除整行内容。我希望保留RS字符串之前的数据,并且只从行中删除RS awk的输入示例: data data data RS_STRING data SEARCHED_STRING data data data data data data data RS_STRING data data data data data data data data RS_STRING d

我有一个输出,我正在通过管道传输到awk,在一些行的末尾发现了一个好的RS字符串。 但当我将尾部字符串定义为RS时,awk只删除整行内容。我希望保留RS字符串之前的数据,并且只从行中删除RS

awk的输入示例:

data data data RS_STRING
data SEARCHED_STRING data data
data data

data data data RS_STRING
data data data
data data

data data data RS_STRING
data SEARCHED_STRING data data
data data
awk的期望输出:

data data data
data SEARCHED_STRING data data
data data

data data data
data SEARCHED_STRING data data
data data
我当前的awk语法是:

awk '/SEARCHED_STRING/' RS = "RS_STRING"
…我得到:

data SEARCHED_STRING data data
data data


data SEARCHED_STRING data data
data data 
正如您通过将RS_字符串定义为RS所看到的,awk会剥离该行中包含的RS前面的所有数据

在过去的三天里,我一直在寻找解决方案,但还没有找到


提前感谢。

使用带空行的awk作为记录分隔符

awk 'BEGIN{RS="";FS="RS_STRING"}
    /SEARCHED_STRING/{$1=$1;print $0 ORS}'  file
如果记录之间没有空行,并且RS_字符串始终位于记录的第一行,请尝试以下操作:

awk '/RS_STRING/{i++}{a[i]=a[i]==""?$0:a[i]RS $0}
    END{for (j=1;j<=i;j++) if (a[j]~/SEARCHED_STRING/) print a[j]}' file
awk'/RS_STRING/{i++}{a[i]=a[i]=''?$0:a[i]RS$0}
结束{(j=1;j非awk答案

perl -00 -ne '/SEARCHED_STRING/ and do {s/RS_STRING//g; print}'
使用搜索字符串搜索段落,并删除“rs”字符串。

它适用于我:

echo "ab RS_STRING cd" | awk '{print "NR="NR ": \""$0"\""}' RS="RS_STRING"
输出

NR=1: "ab "
NR=2: " cd
"

正如您所看到的,除了字符串
“RS\u string”
,没有任何部分被剥离。

欢迎使用堆栈溢出。请尽快阅读页面。RS是记录(行)分隔符;您是否认为您找到了一个好的字段分隔符?如果您指的是记录分隔符,那么示例数据只有3条记录,第三条记录没有终止(第一个RS字符串之前的材质、两个标记之间的材质以及第二个标记之后的材质).您正在使用的RS字符串到底是什么?您如何设置RS?如上所述,我遇到的问题是设置一个不在行首的RS。当我在行首设置RS时,它会从该行剥离,并且该行RS后的数据保持不变。但是如果RS位于任何位置行中的其他内容,直到定义的RS都会被删除。我想保留这些数据。这个示例只是为了说明我要实现的目标。请尝试使用sed并用null替换RS字符串。示例:sed's/RS STRING/'但RS是“行结束”的标志……我刚刚编辑了我的原始帖子,以更好地说明我的问题所在。s既然您已经有了BEGIN块,不妨添加
ORS=“\n\n”
并从print语句中删除ORS。@glennjackman为什么?这是可行的,并且
ORS
ORS=“\n\n”少7个字符
。我通常不使用
BEGIN
block(如果不需要)并在表达式后面添加变量来保存
-v
如下所示我问这个问题是因为我的输入不一定在记录之间有空行,为了获得所需的输出,RS不能是除RS_字符串之外的任何其他内容。如果没有空行,如何对节进行分组?有规则吗?你的意思是如果我看到RS_字符串,这意味着节将从此行开始吗?谢谢,第二个解决方案与中一样有效倾向。相当复杂的语法,将尝试破译它。谢谢,此解决方案产生了预期的结果。您能解释一下语法吗?我很好奇它是如何正确地分隔记录的。我只能识别搜索模式(SEARCHED_STRING)以及将RS_字符串替换为空白。但它如何知道RS_字符串是我的记录分隔符呢?在Perl文档中可以找到:“特殊值00将导致Perl以段落模式读取文件。任何值0400或以上都将导致Perl读取整个文件,但按照惯例,值0777通常用于此目的。"不幸的是,我不明白。有没有办法修改上述解决方案,以便用RS_字符串分隔记录?我的输入不一定在记录之间有空行,因此,当我在实时数据上测试命令时,它包含一些信息,如果RS_字符串正如RS_STRING所定义的那样。谢谢。只需阅读Perl文档:“记住:$/的值是一个字符串,而不是正则表达式。awk必须更好一些。:-”这意味着如果我想用正则表达式定义RS,我需要返回到awk:(