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

前端之家收集整理的这篇文章主要介绍了我怎么知道在bash中首先使用awk发生了哪个分隔符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何使用单个awk行首先知道哪个分隔符已经发生.

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

AB BC DE
BC DE AB
DE BC AB

而且我想知道在每一行中,DE,AB,BC中的哪一个首先发生了.

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

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

$awk -F'AB' '{print $1}' <file>   \
  | awk -F'BC' '{print $1}' <file> \
  | awk -F'DE' '{print $1}' <file>

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

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

首先,如果您的文件仅包含AB,BC或DE组合以及换行符,那么答案很简单:
awk '{print $1}' file

这符合你的榜样.尽管如此,我不相信这种情况.
按理说,Ed Morton解决方案显然是前进的方式!它干净,简单,最重要的是单线.

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

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

RT (gawk extention)
The input text that matched the text denoted by RS,the record
separator. It is set every time a record is read.

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

$echo "AB BC DE BC DE AB DE BC AB" \
   | awk 'BEGIN{RS="DE|AB|BC"}{print RT;exit }' 
AB

现在可以更多地使用这个想法了.在换行符和请求的集合之间不断切换RS.这只是为了展示awk的灵活性.

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

如果是文件

AB BC DE BC DE AB DE BC AB
BC DE AB DE BC AB
DE AB DE BC AB

输出

AB
BC
DE

猜你在找的Bash相关文章