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

时间:2017-06-30 07:22:37

标签: sql bash hadoop awk impala

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

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个字段中(取决于表格所具有的分区数量。) 我想使用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以及表名-edw_customers。在最后两行中,我需要提取数字4,5和表名 - gngi__24 _

2 个答案:

答案 0 :(得分:1)

GNU awk 解决方案:

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

输出:

7 edw_customers
8 edw_customers
4 gngi__24_
5 gngi__24_

答案 1 :(得分:0)

任何awk:

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