sed で引用符を追加できます paste で行をマージします 、そのように:
sed 's/^\|$/"/g'|paste -sd, -
GNU coreutils ベースのシステム (Linux など) を実行している場合は、末尾の '-'
を省略できます。 .
入力データに DOS スタイルの行末がある場合 (@phk が提案したように)、次のようにコマンドを変更できます:
sed 's/\r//;s/^\|$/"/g'|paste -sd, -
awk
の使用 :awk 'BEGIN { ORS="" } { print p"'"'"'"$0"'"'"'"; p=", " } END { print "\n" }' /path/to/list
シェルのエスケープが少ないため読みやすい代替:awk 'BEGIN { ORS="" } { print p"\047"$0"\047"; p=", " } END { print "\n" }' /path/to/list
出力:'d3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
説明:
awk
すべてのエスケープなしのスクリプト自体は BEGIN { ORS="" } { print p"'"$0"'"; p=", " } END { print "\n" }
です .最初のエントリを出力した後、変数 p
設定されています(それ以前は空の文字列のようなものです)。この変数 p
で すべてのエントリ (または awk
内) -話す:録音 ) は前に付けられ、さらに一重引用符で囲まれて印刷されます。 awk
出力レコード区切り変数 ORS
BEGIN
で空に設定されているため (接頭辞がそれを行っているため) は必要ありません。 している。ああ、ファイルを END
にするかもしれません 改行を使用 (たとえば、他のテキスト処理ツールで動作するように); END
の部分は必要ありません その後 (一重引用符内) はすべて削除できます。
Windows/DOS スタイルの行末 (\r\n
)、UNIX スタイル (\n
) に変換する必要があります。 ) 最初。これを行うには、 tr -d '\015'
を置くことができます パイプラインの最初に:
tr -d '\015' < /path/to/input.list | awk […] > /path/to/output
( \r
を使用しないと仮定すると あなたのファイルにあります。ここでは非常に安全な仮定です。)
または、単に dos2unix /path/to/input.list
を実行します 一度ファイルをその場で変換します。
@don_crisstiのリンクされた回答が示すように、貼り付けオプションは信じられないほど高速に接しています.Linuxカーネルのパイピングは、今試していなければ信じていたよりも効率的です.驚くべきことに、コンマ + スペースではなく単一のコンマでリスト項目を区切ることができる場合は、貼り付けパイプライン
(paste -d\' /dev/null - /dev/null | paste -sd, -) <input
妥当な flex
よりも高速です プログラム(!)
%option 8bit main fast
%%
.* { printf("'%s'",yytext); }
\n/(.|\n) { printf(", "); }
しかし、まともなパフォーマンスが許容できる場合 (そして、ストレス テストを実行していない場合、定数係数の違いを測定することはできません。それらはすべて瞬時に行われます)、セパレーターの柔軟性と合理的なセパレーターの両方が必要な場合-liner-y-ness,
sed "s/.*/'&'/;H;1h;"'$!d;x;s/\n/, /g'
あなたのチケットです。はい、回線ノイズのように見えますが、H;1h;$!d;x
イディオムはすべてを丸呑みする正しい方法です。全体が実際に読みやすくなっていることが認識できたら、それは s/.*/'&'/
です 丸呑みと s/\n/, /g
が続きます .
編集:不条理に接して、flex を他のすべての空洞に打ち負かすのはかなり簡単です。組み込みのマルチスレッド/シグナルハンドラー同期が必要ないことを stdio に伝えるだけです:
%option 8bit main fast
%%
.+ { putchar_unlocked('\'');
fwrite_unlocked(yytext,yyleng,1,stdout);
putchar_unlocked('\''); }
\n/(.|\n) { fwrite_unlocked(", ",2,1,stdout); }
ストレス下では、ペースト パイプラインよりも 2 ~ 3 倍高速であり、それ自体は他のすべてよりも少なくとも 5 倍高速です。