如何使用单个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 byRS
,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