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