将过滤后的输出重定向到文件

将过滤后的输出重定向到文件

我将输出重定向到一个文件并得到如下结果:

|  id  | code | color_code | 
-------+------+------------+
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |
(2 rows)

我怎样才能将其转换为 csv 样式,例如:

|  id  | code | color_code | 
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |

为了获取第一个文件,循环运行并启动 sql 脚本。我所做的只是> file。但我无法控制循环。可能在迭代过程中已经可以过滤信息了。但这很值得怀疑。

答案1

awk

awk 'NR==1; /^\|[0-9]/'
  • 默认操作awk是打印记录

  • NR==1匹配第一条记录(行)

  • /^\|[0-9]/匹配以 开头并|跟有数字的任何记录

例子:

% cat file.txt                    
|  id  | code | color_code | 
-------+------+------------+
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
(2 rows)

|  id  | code | color_code | 
-------+------+------------+
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |
(2 rows)

% awk 'NR==1; /^\|[0-9]/' file.txt
|  id  | code | color_code | 
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |

答案2

您可以通过以下命令传输输出sed

sed '1p;/^|/!d;/^|\s*id/d'

解释:

  • 这个表达1p只是重复了第一行。
  • 该表达式/^|/!d删除任何不以 开头的行|
  • 该表达式/^|\s*id/d删除以 开头的所有行|,然后删除一些(或没有)空格字符,后面跟着id。我们已经使用第一个表达式打印了标题,因此现在用这个表达式丢弃它是没问题的。

答案3

你可以使用sed只打印你想要的东西

sed -n '1p; /^|[0-9]/p' file

解释

-n在我们要求之前不打印任何内容,
1p打印第一行,如果该行以数字开头,
^|[0-9]/p则打印该行|

答案4

your_command | grep "|"

将删除那些(2 行)和空行。您可以添加另一个 grep -v "id",它将删除所有标题,然后您只需要在开头使用 echo 命令添加一个标题即可。

相关内容