私が変換したいファイルは次のとおりです。
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
単語自体がある場合は、その文字列を出力します。この呼び出しは、レコードの最初のフィールドが文字列に追加されたときに行の前に追加されたコンマを削除します。コンマ付きの行は、次のコードと同じ方法で処理されます。die
lines
substr()
GNUawk
またはBSDを使用してこれを行うこともできますが、mawk
BSDは使用できません。awk
mawk -v RS='\ndie\n' -v FS='\n' -v ORS='\n' -v OFS=',' '{$1=$1;print}' file
カンマを含むデータには引用符付きのフィールドは生成されません。
出力前に(出力フィールド区切り文字)および(出力レコード区切り文字)変数に基づいてレコードを$1=$1
強制的に再設定しますawk
。OFS
ORS
質問を更新する前に答えてください。
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]