【问题标题】:Awk to filter file based on conditionsawk 根据条件过滤文件
【发布时间】:2018-03-05 10:47:40
【问题描述】:

我正在使用下面的代码来过滤我的源文件。 此代码包含多个 gsub 条件

但这里的问题是由于多个 gsub,脚本需要大量时间来执行和解析另一个文件中的数据。 您能否请我知道实现这些条件的其他方法,以便我的脚本可以更快地执行

awk -F"[        \t]" -v OFS="|" '{gsub(/^[ \t]+|[ \t]+$/,"");gsub(/"/,"");gsub(/[[:blank:]]+|\.|\-/,"",$32);gsub(/[[:blank:]]+|\.|\-/,"",$13);gsub(/^[[:space:]]+|[[:spa
ce:]]+$|\,/,"",$38);gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$42);gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$44);gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);gsub(/^[[:spa
ce:]]+|[[:space:]]+$/,"",$40);gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);

这里是相同的代码,但为了便于阅读(仅出于可读性目的)分成几部分:

awk -F"[        \t]" -v OFS="|" '{gsub(/^[ \t]+|[ \t]+$/,"");
                                  gsub(/"/,"");
                                  gsub(/[[:blank:]]+|\.|\-/,"",$32);
                                  gsub(/[[:blank:]]+|\.|\-/,"",$13);
                                  gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$38);
                                  gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$42);
                                  gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$44);
                                  gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);
                                  gsub(/^[[:space:]]+|[[:space:]]+$/,"",$40);
                                  gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);

如果需要输入文件,请告诉我,将分享它

【问题讨论】:

  • 现在需要多少时间来处理一个多大的文件?它必须运行多快才能对您有用?
  • 恭喜你写了这篇文章。但请解释它的作用。每个 gsub 都有特定的用途,我们不知道。请阅读stackoverflow.com/help/mcve。知道目的或目标后,我们或许可以提出其他建议以更快地获得相同的结果。一个示例输入文件(不是超大文件,用于说明需求)会有所帮助。
  • 嗨 Jas,输入文件大约 400MB,需要 2-3 小时。需要一种我可以在 20-25 分钟内执行的方法。
  • 使用“更好”的语言重写。在速度方面更好。我使用 perl 脚本替换了 bash 脚本,结果令人惊讶。
  • @as7951:发布您的输入文件的 sn-p 并向我们展示您想要实现的具体目标。

标签: linux bash shell awk scripting


【解决方案1】:

这不是 anwser,而是您的代码的可读版本:

awk -F"[        \t]" -v OFS="|" '
  { gsub(/^[ \t]+|[ \t]+$/,"");
    gsub(/"/,"");  
    gsub(/[[:blank:]]+|\.|\-/,"",$32);
    gsub(/[[:blank:]]+|\.|\-/,"",$13);
    gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$38);
    gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$42);
    gsub(/^[[:space:]]+|[[:space:]]+$|\,/,"",$44);
    gsub(/^[[:space:]]+|[[:space:]]+$/,"",$27);
    gsub(/^[[:space:]]+|[[:space:]]+$/,"",$40);
    gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",$18);
  }' # closing brace and quote were probably missing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2023-01-20
    • 2021-04-19
    • 2019-06-08
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多