web-dev-qa-db-ja.com

フィルター処理された出力をファイルにリダイレクトする

出力をファイルにリダイレクトすると、次のようなメッセージが表示されます。

|  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。しかし、ループを制御することはできません。おそらく、情報は反復中にすでにフィルター処理できます。しかし、これはかなり疑わしいです。

4
user1648825

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    |
6
heemayl

次のsedコマンドで出力をパイプできます。

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

説明:

  • 1pは、最初の行をエコーするだけです。
  • /^|/!dは、|で始まらない行を削除します。
  • /^|\s*id/dは、|で始まる行を削除し、次に空白文字の後にidが続く(またはまったくない)行を削除します。最初の式を使用してヘッダーをすでに印刷しているため、この式でヘッダーを破棄してもかまいません。
5
Melebius

sedを使用して、必要なものだけを印刷できます

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

説明

-n要求するまで何も出力しない
1p最初の行を出力
^|[0-9]/p|で始まり、その後に数字が続く場合、行を出力します

3
Zanna

これに使用できる小さな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+)。そうでない場合は、コメントを残してください。正規表現を調整できます。

1
Wayne_Yux
your_command | grep "|"

それら(2行)と空の行を取り除きます。別のgrep -v "id"を追加すると、すべてのヘッダーが削除されます。その後、先頭にechoコマンドで1つのヘッダーを追加するだけです。

1
marosg

この小さなシェルスクリプトはどうですか? 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

そのスクリプトを保存し、実行権限を付与します。このスクリプトには、最初のパラメーターとしてファイル名が必要です。

1
Kev Inski