出力をファイルにリダイレクトすると、次のようなメッセージが表示されます。
| 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
。しかし、ループを制御することはできません。おそらく、情報は反復中にすでにフィルター処理できます。しかし、これはかなり疑わしいです。
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 |
次のsed
コマンドで出力をパイプできます。
sed '1p;/^|/!d;/^|\s*id/d'
説明:
1p
は、最初の行をエコーするだけです。/^|/!d
は、|
で始まらない行を削除します。/^|\s*id/d
は、|
で始まる行を削除し、次に空白文字の後にid
が続く(またはまったくない)行を削除します。最初の式を使用してヘッダーをすでに印刷しているため、この式でヘッダーを破棄してもかまいません。sed
を使用して、必要なものだけを印刷できます
sed -n '1p; /^|[0-9]/p' file
-n
要求するまで何も出力しない1p
最初の行を出力^|[0-9]/p
|
で始まり、その後に数字が続く場合、行を出力します
これに使用できる小さなPerlスクリプトを次に示します。
#!/usr/bin/Perl
use strict;
use warnings;
my$file="file.txt";
open(IN,"<",$file);
my$head=<IN>;
print $head;
while(<IN>)
{
print $_ if $_=~/^\|\S+/;
}
close IN;
これにより、入力ファイルの最初の行がヘッダーとして出力され、ファイルの残りの部分がループされてコンテンツ行が出力されます。
注:
ここでは、コンテンツ行は常にパイプ記号で始まり、その後に1つ以上の非空白文字(|\S+
)。そうでない場合は、コメントを残してください。正規表現を調整できます。
your_command | grep "|"
それら(2行)と空の行を取り除きます。別のgrep -v "id"を追加すると、すべてのヘッダーが削除されます。その後、先頭にechoコマンドで1つのヘッダーを追加するだけです。
この小さなシェルスクリプトはどうですか? grep
を含むuser596137の回答を使用し、そのファイルに出力を書き込みます
#!/bin/bash
FILE=$1
FIRST_LINE=`head -n1 ${FILE}`
INPUT=`cat ${FILE} | grep "|" | grep -v "id"`
echo "$FIRST_LINE" > $FILE; echo "$INPUT" >> $FILE
そのスクリプトを保存し、実行権限を付与します。このスクリプトには、最初のパラメーターとしてファイル名が必要です。