我怎么知道在bash中首先使用awk发生了哪个分隔符?

Jen*_*ada 6 bash shell awk sed

如何使用单行首先知道哪个分隔符已经发生awk.

假设我有一个包含内容的文件:

AB BC DE
BC DE AB
DE BC AB
Run Code Online (Sandbox Code Playgroud)

我想知道其中的三个DE,AB,BC已首先在每一行发生.

我以为我可以使用分隔符BC然后取第一个字段然后BC然后取第一个字段AB.

这可以通过以下方式完成:

$ awk -F'AB' '{print $1}' <file>   \
  | awk -F'BC' '{print $1}' <file> \
  | awk -F'DE' '{print $1}' <file>
Run Code Online (Sandbox Code Playgroud)

但是,有没有其他方法可以动态更改awk行中的分隔符并使用awk只完成一次上面的事情?

编辑:纠正了之前完成的错误.

Ed *_*ton 6

如果这不是你想要的:

awk 'match($0,/AB|BC|DE/){print substr($0,RSTART,RLENGTH)}' file
Run Code Online (Sandbox Code Playgroud)

然后编辑您的问题以阐明您的要求,并提供简明,可测试的样本输入和预期输出.


kva*_*our 4

首先,如果您的文件仅包含组合或AB与的组合,那么答案很简单:BCDEnewline

awk '{print $1}' file
Run Code Online (Sandbox Code Playgroud)

这符合你的例子。尽管如此,我不相信情况是这样。按理说,埃德·莫顿的解决方案显然是前进的方向!它干净、简单,最重要的是一句台词。

然而,从纯粹的教育角度来看,awk这里提出了一种不同的方法。

如果您想找到一行中的“第一个”分隔符,您可以从不同的角度解决问题。您可以将其理解为一组记录,而不是将该行解释为一组列。这就带来了“首先找到哪个记录分隔符”的问题:

RT(gawk 扩展)RS与记录分隔符 表示的文本匹配的输入文本。每次读取记录时都会设置它。

对于单行字符,您可以执行以下操作:

$ echo "AB BC DE BC DE AB DE BC AB" \
   | awk 'BEGIN{RS="DE|AB|BC"}{print RT;exit }' 
AB
Run Code Online (Sandbox Code Playgroud)

现在可以进一步发挥这个想法了。RS不断地在换行符和请求的集合之间切换。这只是为了显示awk它的灵活性。

$ awk 'BEGIN{RSSET="DE|AB|BC";RS=RSSET}
       (RS=="\n"){RS=RSSET;next}
       {print RT; RS="\n"; next}' file
Run Code Online (Sandbox Code Playgroud)

如果文件是

AB BC DE BC DE AB DE BC AB
BC DE AB DE BC AB
DE AB DE BC AB
Run Code Online (Sandbox Code Playgroud)

它输出

AB
BC
DE
Run Code Online (Sandbox Code Playgroud)