我有这些命令来显示分区中的文件数。
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 _
答案 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_