行の特定の部分でスペースをコンマで置き換えます。

行の特定の部分でスペースをコンマで置き換えます。

以下はデータベースクエリの出力です。

    1 KALI,REGISTERED
    2 KALI,PROCESSING
    3 KALI,RECEIVED
    1 KALI,SUBMITTED
    7 KALI,SUCCEEDED
    4 WEKA,PROCESSING

出力は毎回変更され、行数はクエリが最後に実行されたときとは異なる場合がありますが、フォーマットは常に次のようになりますnumber space word,word。次のように見えるようにする必要がありますnumber,word,word。クエリ自体でこの問題を処理しようとしましたが、データベースはそれをサポートしていないため、Linuxを使用して処理することにしました。このコマンドを使用してスペースをコンマで置き換えます。sed -e 's/\s\+/,/g' command.output.次のような出力が表示されます。

,1,KALI,REGISTERED,
,2,KALI,PROCESSING,
,3,KALI,RECEIVED,
,1,KALI,SUBMITTED,
,7,KALI,SUCCEEDED,
,4,WEKA,PROCESSING,  

しかし、私は配列に保存できるように、次のようなことを期待しています。

1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING  

さらにコマンドを試しましたが、何も機能しませんでした。この出力をどのように取得できますか?

ベストアンサー1

理想的には、必要な形式でデータを出力するようにデータベースクエリを変更する必要があります。

$ awk -v OFS=',' '{ $1 = $1; print }' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING

awkこれは、スペースまたはタブ区切りデータをコンマ区切りデータに再フォーマットするために使用されます。OFS出力フィールド区切り記号をコンマに設定し、各入力レコードのフィールド値を変更すると、レコードは新しい出力区切り文字でawk再生成されます。印刷すると、目的の結果が表示されます。

awkデフォルトでは、各行を読み取るとき、各行の先頭または末尾のスペースも無視されます。

以下を使用してこれを行うには、最初の最初のsedスペースをすべて削除してから、残りの最初のスペースをコンマに変更します。

$ sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]/,/' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING

このパターンはスペースまたはタブと一致します(Perl正規表現と[[:blank:]]同様)。\s私は習慣的にそれを使用しますが、実際にタブを扱わない限り(質問では明確ではありません)、単一のリテラルスペースを使用したいと思います。sed同じパラメータに両方の式を作成することもできます。

sed 's/^ *//; s/ /,/' file

おすすめ記事