在文件中搜索模式时中断 awk 语句

在文件中搜索模式时中断 awk 语句

我有一个 33 GB 的文件。在此文件中,第一列是国家/地区代码(例如:AT、BE、CA、DE、DK、GB、IE、IT 等)。我正在使用 awk 命令,如下所示:

awk -F"|" '$1~/^AT/ {print $0}'

这个命令工作正常。但 awk 读取整个文件需要近 1.5 小时。

有没有办法在 awk 命令完成搜索模式时中断它。

示例:当它完成搜索 AT 时,它应该停止搜索文件的其余部分。

我正在使用的文件已排序。

答案1

如果您知道文件中的下一个代码,

awk '/^BE/ { exit }; /^AT/' file

另请注意,该-F选项在这种孤立的场景中并不是真正有用,并且{ print $0 }如果这是您想要的特定操作,则无需显式给出默认操作。

如果您需要重复执行此操作,那么使用单个脚本在一次遍历原始文件中提取您想要分隔文件的部分显然会更有效。如果您想提取全部(或主要部分),另请参阅csplit(也许在提取全部文件后删除不需要的文件?)

答案2

由于文件已排序,因此当第一个字段在您要查找的字段之后排序时,您可以使用字符串比较来退出。

awk -F"|" '$1 ~ /^AT/ {print $0} $1 > "AT" {exit}'

当然,这不会使查找字母表中后面的代码第一次出现的速度更快,因此考虑使用适当的索引进行更复杂的操作可能是个好主意。

答案3

当然,只需添加exit

awk -F"|" '$1~/^AT/ {print $0; exit}'

这将导致它在找到第一个字段以 开头的第一行时立即退出AT。如果您希望它在找到第一个字段的第一行时立即停止从 开始AT,您可以使用:

awk -F"|" '{if($1~/^AT/){print $0}else{exit}}' 

如果您的行在第一行之前不以 开头,AT并且您想在AT打印以 开头的行之后停止,请使用:

awk -F"|" '{if($1~/^AT/){print $0; a=1}else if(a==1){exit}}'  

相关内容