awk - 合并文件中的行 |性能改进

标签 awk gawk

我有一个文件,我必须根据以下内容合并 2 行:
- 通用sessionID
- 紧邻的下一个匹配模式(GX 和 QG)

文件1:

session=001,field01,name=GX1_TRANSACTION,field03,field04    
session=001,field91,name=QG    
session=001,field01,name=GX2_TRANSACTION,field03,field04    
session=001,field92,name=QG    

session=004,field01,name=GX1_TRANSACTION,field03,field04    
session=002,field01,name=GX1_TRANSACTION,field03,field04    
session=002,field01,name=GX2_TRANSACTION,field03,field04    
session=002,field92,name=QG    

session=003,field91,name=QG    
session=003,field01,name=GX2_TRANSACTION,field03,field04    
session=003,field92,name=QG    

session=004,field91,name=QG    
session=004,field01,name=GX2_TRANSACTION,field03,field04    
session=004,field92,name=QG    

我创建了一个 awk(我是新手,仅从该门户学习了 awk),它创建了我想要的输出。

输出1

session=001,field01,name=GX1_TRANSACTION,field03,field04,session=001,field91,name=QG
session=001,field01,name=GX2_TRANSACTION,field03,field04,session=001,field92,name=QG
session=002,field01,name=GX1_TRANSACTION,field03,field04,NOMATCH-QG
session=002,field01,name=GX2_TRANSACTION,field03,field04,session=002,field92,name=QG
session=003,field01,name=GX2_TRANSACTION,field03,field04,session=003,field92,name=QG
session=004,field01,name=GX1_TRANSACTION,field03,field04,session=004,field91,name=QG
session=004,field01,name=GX2_TRANSACTION,field03,field04,session=004,field92,name=QG

输出2:待处理

session=003,field91,name=QG    

awk:

{
    if($0~/name=GX1_TRANSACTION/ || $0~/GX2_TRANSACTION/) {
        if($1 in ccr)
            print ccr[$1]",NOMATCH-QG";
        ccr[$1]=$0;
    }
    if($0~/name=QG/) {
        if($1 in ccr) {
            print ccr[$1]","$0;
            delete ccr[$1];
        }
        else {
            print $0",NOUSER" >> Pending
        }
    }
}
END {
    for (i in ccr)
        print ccr[i]",NOMATCH-QG"
} 

命令:

awk -F"," -v Pending=t -f a.awk file1    

但问题是我的“file1”真的很大,所以我想提高这个脚本的性能。他们有什么方法可以提高我的性能吗?

最佳答案

有一些更改可能会导致速度略有提高,如果没有的话,可能会给您一些关于 future awk 脚本的想法。

  1. 如果不需要,请不要“手动”测试每一行 - 将 name= 测试提升到主 awk 循环。目前,您的脚本每行最多检查 3 次 $0 是否有 name= 匹配。
  2. 由于您使用 , 作为 FS,因此测试相应字段 ($3) 而不是 $0 >。它仅保存示例数据中模式匹配的几个前导字符。

这是重构的a.awk:

$3~/name=GX[12]_TRANSACTION/ {
    if($1 in ccr)
        print ccr[$1]",NOMATCH-QG";
    ccr[$1]=$0;
}

$3~/name=QG/ {
    if($1 in ccr) {
        print ccr[$1]","$0;
        delete ccr[$1];
    }
    else {
        print $0",NOUSER"  >> Pending
    }
}

END { for (i in ccr) print ccr[i]",NOMATCH-QG" }

我还将 GX 模式匹配压缩为一个正则表达式。我得到与您的示例相同的输出。

关于awk - 合并文件中的行 |性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20822107/

相关文章:

vim - 将多行合并为一行

linux - 仅在日期为 > 使用 awk 时提取数据

bash - awk、gsub、& 符号和意外扩展

linux - GAWK 脚本 - 在 BEGIN 部​​分打印文件名

linux - uniq -c 不能与 awk 一起使用吗?

Unix:使用第二列合并2个文件

arrays - 使用 du 定义遍历目录的数组

json - Curl 从输出中获取特定值

awk - 多个输入文件 - 循环遍历一个文件并检查第二个文件中是否包含字符串 - 输出段落

variables - 如何检查 awk 变量的类型?