如何用单行awk命令判断每行首个出现的目标分隔符?
用单次Awk命令找出最先出现的目标字符串
当然可以!你之前的多管道方法其实逻辑有问题(每个awk都是直接读取原文件,不是处理前一步的输出,根本没实现找最先出现分隔符的目的),用单次awk就能完美解决这个需求,而且逻辑清晰多了。
核心思路
不需要动态切换分隔符,我们可以直接用awk的index()函数获取每个目标字符串的首次出现位置,然后比较这三个位置的大小,位置最小的就是最先出现的那个字符串。
实现命令
awk '{ # 获取三个目标字符串的首次出现位置,不存在则返回0 pos_ab = index($0, "AB") pos_bc = index($0, "BC") pos_de = index($0, "DE") # 初始化最小位置为比行长大的值,确保任何有效位置都比它小 min_pos = length($0) + 1 result = "" # 逐个比较,更新最小位置和对应结果 if (pos_ab > 0 && pos_ab < min_pos) { min_pos = pos_ab result = "AB" } if (pos_bc > 0 && pos_bc < min_pos) { min_pos = pos_bc result = "BC" } if (pos_de > 0 && pos_de < min_pos) { min_pos = pos_de result = "DE" } # 输出结果 print result }' file
逻辑拆解
index($0, "XXX"):返回字符串XXX在当前行$0中首次出现的起始位置(从1开始计数),如果没找到就返回0。- 我们先把
min_pos设为比当前行长度大1的值,这样任何有效位置(大于0)都会比它小。 - 依次检查三个目标字符串的位置,如果它存在且位置比当前
min_pos小,就更新min_pos和对应的结果字符串。 - 最后输出找到的最先出现的字符串。
测试示例
比如你的测试行AB BC DE BC DE AB DE BC AB,AB的位置是1,是最小的,所以输出AB;如果换一行是BC AB DE,则输出BC;如果是DE BC AB,就输出DE。
内容的提问来源于stack exchange,提问作者Jenil Mewada
相关产品推荐
相关产品推荐

