web-dev-qa-db-ja.com

行をCSVファイルに変換するためのコマンド

各行の前に先頭にスペースがある形式のファイルがあります。

 "Western Overseas",
 "Western Overseas",
 "^",
 "--",
 "^",
 "--",
 "--",
 null,
 24995,
 9977,
 "CR",

 "Western Refrigeration Private Limited",
 "Western Refrigeration Private Limited",
 "[ICRA]A",
 "--",
 "[ICRA]A1",
 "--",
 "Stable",
 null,
 14951,
 2346,
 "CR",

次の形式のCSVファイルに変換したいと思います。

 "Western Overseas","Western Overseas","^","--","^","--","--",null,24995,9977,"CR"
 "Western Refrigeration Private Limited","Western Refrigeration Private Limited","[ICRA]A","--","[ICRA]A1","--","Stable",null,14951,2346,"CR"

trを使おうとしていますが、すべての出力を1行に出力し、改行を2つの改行に置き換えているように見えるため問題が発生しています。どんな助けでも大歓迎です。

2
user362513

Awkソリューションは

awk '{if(NF){gsub(/^ |,$/,""); printf c $0; c=","}else{printf "\n"; c=""}};END{printf "\n"}'

コメントで拡張:

{
    if(NF) { # if the line isn't empty
        gsub(/^ |,$/,""); # remove the first space and last comma
        printf c $0; # print the line (without a newline)
        c="," # set c to add a comma for the next field
    } else {
        printf "\n"; # empty line, output a newline
        c="" # don't print a comma for the next entry
    }
};
END {
    printf "\n" # finish off with a newline
}
3
Dabombber
<file sed '
   :start
   s/\n$//
   t
   s/\n //
   N
   b start
  ' | sed 's/,$//'

最初のsedはループし(:startb start)、最後の改行が見つかって削除されるまで(s/\n$//)、パターンスペース(N)に行を追加します。これは、空の行が読み取られたことを示し、ツールはループを終了します(t)。各反復で、残っている改行(および連続するスペース)は、行を連結するためにとにかく削除されます(s/\n //)。

2番目のsedは、末尾のコンマを削除します。

1