![将过滤后的输出重定向到文件](https://linux22.com/image/887626/%E5%B0%86%E8%BF%87%E6%BB%A4%E5%90%8E%E7%9A%84%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6.png)
我将输出重定向到一个文件并得到如下结果:
| 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 命令添加一个标题即可。