首页 > 解决方案 > AWK - 解析 SQL 输出

问题描述

我从自定义工具的输出中得到了如下所示的 SQL 输出。将不胜感激任何帮助找出我做错了什么。

column1                  | column2 | column3 | column4 | column5 | column6 |     column7     | column8 | column9 |        column10            |          column11          
--------------------------------------+----------+-------------+-------------+--------------------+-----------------------+--------------------+---------------+----------------
 cec75                   | 1234     | 007    |         |    2810 |         | SOME_TEXT       |         |         | 2020-12-07 20:28:46.865+00 | 2020-12-08 06:40:10.231635+00
(1 row)

我正在尝试将此输出传输到我需要的列column1column2column7。我尝试过这样的管道,但它只打印column1

tool check | awk '{print $1, $2}'

column1 |
--------------------------------------+----------+-------------+-------------+--------------------+-----------------------+--------------------+---------------+----------------+----------------------------+------------------------------- 
cec75 |
(1 row) 

有这样的东西会很好。

ce7c5,1234,SOME_TEXT

我的文件内容


                  column1                  | column2 | column3 | column4 | column5 | column6 |     column7     | column8 | column9 |        column10         |          column11          
--------------------------------------+----------+-------------+-------------+--------------------+-----------------------+--------------------+---------------+----------------+----------------------------+-------------------------------
 6601c | 2396     | 123         |             |               9350 |                       | SOME_TEXT |               |                | 2020-12-07 22:49:01.023+00 | 2020-12-08 07:22:37.419669+00
(1 row)


                  column1                  | column2 | column3 | column4 | column5 | column6 |     column7     | column8 | column9 |        column10         |          column11          
--------------------------------------+----------+-------------+-------------+--------------------+-----------------------+--------------------+---------------+----------------+----------------------------+-------------------------------
 cec75 | 1567     | 007        |             |               2810 |                       | SOME_TEXT |               |                | 2020-12-07 20:28:46.865+00 | 2020-12-08 07:28:10.319888+00
(1 row)

标签: sqlbashawk

解决方案


您需要设置正确FS并以某种方式过滤掉不需要的(垃圾)行。我会按照以下方式进行。让file.txt内容为:

column1                  | column2 | column3 | column4 | column5 | column6 |     column7     | column8 | column9 |        column10            |          column11          
--------------------------------------+----------+-------------+-------------+--------------------+-----------------------+--------------------+---------------+----------------
 cec75                   | 1234     | 007    |         |    2810 |         | SOME_TEXT       |         |         | 2020-12-07 20:28:46.865+00 | 2020-12-08 06:40:10.231635+00
(1 row)

然后

awk 'BEGIN{FS="[[:space:]]+\\|[[:space:]]+";OFS=","}(NR>=2 && NF>=2){print $1,$2,$7}' file.txt

输出:

cec75,1234,2020-12-07 20:28:46.865+00

说明:我将字段分隔符 ( FS) 设置为一个或多个:space:字面值的|一个或多个:space:,其中:space:表示任何空格。根据您的数据,您可能会选择使用零个或多个而不是一个或多个 - 这样做替换+*. 对于不是第一行(此过滤出标题)且至少有 2 个字段(此过滤出带有-and+和的行(1 row))的每一行,我打印第一列,的内容,然后是第二列的,内容,然后是第七列的内容柱子。


推荐阅读