複数行ファイルを複数行ファイルに変換

複数行ファイルを複数行ファイルに変換

私が変換したいファイルは次のとおりです。

john doe  
555-666-333  
[email protected]  
die  
jane doe  
Beverly Hills
444-333-111  
[email protected]  
die  

結果ファイルが次のようになります。

john doe,555-666-333,[email protected]  
jane doe,Beverly Hills,444-333-111,[email protected]

単語がdieファイルにあり、上記のように出力に表示されないように、この単語を使用して行を区切りたいと思います。

編集する
ファイル形式を変更しました。電子形式は、単語数が単語ごとに異なる可能性があるという事実を考慮しませんdie

ベストアンサー1

$ awk -v OFS=',' '/^die$/ { print substr(lines,2); lines=""; next } { lines=lines OFS $0 }' file
john doe,555-666-333,[email protected]
jane doe,Beverly Hills,444-333-111,[email protected]

コンマを含むデータにも同じ内容が適用されます(下記の回答の最後を参照)。データにカンマが含まれている場合は、次のものを使用できます。

awk -v OFS=',' '
    /^die$/ { print substr(lines,2); lines=""; next }
    /,/     { $0=sprintf("\"%s\"", $0 ) }
            { lines=lines OFS $0 }' file

このコードは(カンマ)linesで区切られた文字列を作成します。 1行にOFS単語自体がある場合は、その文字列を出力します。この呼び出しは、レコードの最初のフィールドが文字列に追加されたときに行の前に追加されたコンマを削除します。コンマ付きの行は、次のコードと同じ方法で処理されます。dielinessubstr()

GNUawkまたはBSDを使用してこれを行うこともできますが、mawkBSDは使用できません。awk

mawk -v RS='\ndie\n' -v FS='\n' -v ORS='\n' -v OFS=',' '{$1=$1;print}' file

カンマを含むデータには引用符付きのフィールドは生成されません。

出力前に(出力フィールド区切り文字)および(出力レコード区切り文字)変数に基づいてレコードを$1=$1強制的に再設定しますawkOFSORS


質問を更新する前に答えてください。

paste -d, - - - - <file

これは生産します

john doe,555-666-333,[email protected],die
jane doe,444-333-111,[email protected],die

この行を削除するにはdie(完全に不要です):

paste -d, - - - - <file | cut -d, -f 1-3

上記の方法は、元のデータにカンマが含まれていない場合に機能します。

die最初から行をフィルタリングすることもできます。

sed '/^die$/d' file | paste -d, - - -

これは、元のデータにカンマが含まれている場合にも機能します。

データにカンマが含まれている場合は、前処理して行の周りに引用符を追加する必要があります。

awk '/^die$/ { next } /,/ { $0=sprintf("\"%s\"", $0 ) } 1' file | paste -d, - - -

与えられたファイル

john doe
555-666-333
[email protected]
die
jane doe
444-333-111
[email protected]
die
Me, myself and I
000-000-000
[email protected]

最後のコマンドが生成されます

john doe,555-666-333,[email protected]
jane doe,444-333-111,[email protected]
"Me, myself and I",000-000-000,[email protected]

おすすめ記事