加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:35:03 所属栏目:安全 来源:网络整理
导读:如何使用单个awk行首先知道哪个分隔符已经发生. 假设我有一个包含内容的文件: AB BC DEBC DE ABDE BC AB 而且我想知道在每一行中,DE,AB,BC中的哪一个首先发生了. 我以为我可以使用分隔符BC然后取第一个字段然后BC,然后取AB的第一个字段. 这可以通过以下方式
如何使用单个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读