コンマがあってはならない最後の行を除いて、各行を一重引用符/二重引用符で囲み、コンマで終わるにはどうすればよいですか?

コンマがあってはならない最後の行を除いて、各行を一重引用符/二重引用符で囲み、コンマで終わるにはどうすればよいですか?

一重引用符/二重引用符で囲み、カンマで終わりたいです。ただし、最後のレコードであるため、最後の行にカンマを含めないようにすることも必要です。

同じ要件を持つ複数の投稿が見つかりましたが、最後の行を除外した投稿が見つかりませんでした。

以下は私が保存したサンプルデータです。/tmp/x

ANONYMOUS
APEX_040200
APEX_PUBLIC_USER
APPQOSSYS
AUDSYS

以下では、目的の出力は一重引用符で囲まれています。後で二重引用符を使用する必要があります。

'ANONYMOUS',
'APEX_040200',
'APEX_PUBLIC_USER',
'APPQOSSYS',
'AUDSYS'

次のように使用できますが、最後の行を一重引用符/二重引用符で囲むようにする方法がわかりません。しかし、カンマはありません。

awk '{ printf "'\''%s'\'',\n", $0 }' /tmp/x ## single-quote
awk '{ printf "\"%s\",\n", $0 }' /tmp/x ## double-quote

したがって、結果の出力は次のようになります。最後のレコードのカンマを参照してください。

"ANONYMOUS",
"APEX_040200",
"APEX_PUBLIC_USER",
"APPQOSSYS",

'ANONYMOUS',
'APEX_040200',
'APEX_PUBLIC_USER',
'APPQOSSYS',

,最後の行の末尾を抑制する方法は何ですか?

答え1

awkを使用してください。

$ awk -v q=\' -v ORS= '{print s q $0 q; s=","RS} END{print RS}' file
'ANONYMOUS',
'APEX_040200',
'APEX_PUBLIC_USER',
'APPQOSSYS',
'AUDSYS'

または、単一引用符の代わりに二重引用符を使用するには、次のように変更-v q=\'します-v q=\"

$ awk -v q=\" -v ORS= '{print s q $0 q; s=","RS} END{print RS}' file
"ANONYMOUS",
"APEX_040200",
"APEX_PUBLIC_USER",
"APPQOSSYS",
"AUDSYS"

答え2

次のawk手順が機能します。

awk 'FNR>1{printf ",\n"} {printf "\047%s\047",$0} END{printf "\n"}' input.txt

これは

  • 最初の入力行を処理するときは、他のものより前にカンマと改行文字を印刷して「前の行」を終了します。
  • 一重引用符で囲まれた現在の行の内容を印刷します(8進数ASCIIコード)、しかしいいえカンマまたは改行(何が必要かはまだわからないので)
  • ファイルの終わりで、最後の入力行に対応する出力を終了する改行文字のみを印刷します。

答え3

AWKに行けばいいですか? sedを使用すると、最後の行を直接確認できるため、($)を使用して最後のコンマを削除できます$s/,$//

または、引用符とコンマを完全に追加し、最後の行からカンマを削除します。

% sed -e "s/.*/'&',/" -e '$s/,$//' file.txt
'ANONYMOUS',
'APEX_040200',
'APEX_PUBLIC_USER',
'APPQOSSYS',
'AUDSYS'

または、シェル変数を使用して引用符文字を保存すると、次のように単一引用符で置き換えることができますq=\'

% q=\"
% sed -e "s/.*/$q&$q,/" -e '$s/,$//' file.txt
'ANONYMOUS',
'APEX_040200',
'APEX_PUBLIC_USER',
'APPQOSSYS',
'AUDSYS'

答え4

出力を次にパイプしますsed

awk '{ printf "\"%s\",\n", $0 }' /tmp/x | sed '$ s/.$//'

源泉

関連情報