GNU/Linux >> Linux の 問題 >  >> Linux

個々の行を引用符で囲まれたコンマ区切りのリストに変換する

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 倍高速です。


Linux
  1. 3つの連続した行をスワップとマージしますか?

  2. DNSSECでドメインを一覧表示する方法

  3. Go For It –タイマー付きの最新のToDoリスト

  1. 2 つのテキスト リスト (1 つのリストはファイル) をセミコロンで区切って 1 つのリストに貼り付けます

  2. 複数行のファイル名をカスタム区切り文字で 1 つに結合する方法は?

  3. 非常に長い単語行を最大長の別々の行に分割する

  1. 値が欠落している新しい行を挿入しますか(na)?

  2. 出力を新しい行に分割しますか?

  3. VSFTPD での許可されたユーザー リストの使用