使用 AWK 过滤掉每一行的不同字段

Filter out different fields for each line with AWK

我有这些命令来显示分区中的文件数。

echo '' > ~/partitions_mkt_296 ; impala-shell -i czmorehr -q "use cz_prd_mkt_op; show tables;" -B | while read a; do impala-shell -q "show partitions cz_prd_mkt_op.${a};" -B -i czmorehr >> ~/partitions_mkt_296.txt; done

问题是在生成的文件中 - 我寻找的数字有时在第 3、4 或第 7 个字段中(取决于 table 具有的分区数。
我想使用 awk 提取所有可能的列,然后过滤掉那些我不想包含“=”、“.”的前提。要么 ”-”。 - 并仅显示不包含这些的字段。
这有可能实现吗?

示例输入为:

2017052118  -1  7   197.70MB    NOT CACHED  NOT CACHED  PARQUET false   hdfs://MORPHEUS/user/hive/warehouse/cz_prd_mkt_op.db/edw_customers/pr_load_time=2017052118
2017052209  -1  8   198.31MB    NOT CACHED  NOT CACHED  PARQUET false   hdfs://MORPHEUS/user/hive/warehouse/cz_prd_mkt_op.db/edw_customers/pr_load_time=2017052209
0   2017062006  -1  4   232.42MB    NOT CACHED  NOT CACHED  PARQUET false   hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/gngi__24_/pr_comp_ver=0/pr_start_time=2017062006
0   2017062007  -1  5   347.36MB    NOT CACHED  NOT CACHED  PARQUET false   hdfs://MORPHEUS/user/hive/warehouse/cz_prd_ntw_op.db/gngi__24_/pr_comp_ver=0/

在前两行中,我想提取数字 7,8 以及 table 名称 -edw_customers。在最后两行中,我需要提取数字 4,5 和 table 名称 - gngi__24_

GNU awk 解决方案:

awk '~/^hdfs/{ match(,/_op\.db\/([^\/]+)/,a); num=; tn=a[1] }
     ~/^hdfs/{ match(,/_op\.db\/([^\/]+)/,a); num=; tn=a[1] }{ print num,tn }' file

输出:

7 edw_customers
8 edw_customers
4 gngi__24_
5 gngi__24_

使用任何 awk:

$ awk '{gsub(/.*_op\.db\/|\/.*/,"",$NF); print $(NF-8), $NF}' file
7 edw_customers
8 edw_customers
4 gngi__24_
5 gngi__24_