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

use*_*825 4 command-line bash pipe text-processing

我将输出重定向到一个文件中,然后得到如下信息:

|  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)
Run Code Online (Sandbox Code Playgroud)

如何将其转换为 csv 样式,例如:

|  id  | code | color_code | 
|11A00B|  15  | 9129102    |
|11A00C|  16  | 9129103    |
|11B00B|  25  | 9129152    |
|11B00C|  36  | 9129162    |
|11C00B|  22  | 9129107    |
|11C00C|  9   | 9129108    |
Run Code Online (Sandbox Code Playgroud)

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

hee*_*ayl 6

awk

awk 'NR==1; /^\|[0-9]/'
Run Code Online (Sandbox Code Playgroud)
  • 中的默认操作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    |
Run Code Online (Sandbox Code Playgroud)


Mel*_*ius 5

您可以通过以下sed命令管道输出:

sed '1p;/^|/!d;/^|\s*id/d'
Run Code Online (Sandbox Code Playgroud)

解释:

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