如何将每一行括在单/双引号中并以逗号结尾,除了最后一行不应有逗号?

如何将每一行括在单/双引号中并以逗号结尾,除了最后一行不应有逗号?

我想将它们括在单/双引号中并以逗号结尾。但我还需要它,以便最后一行不包含逗号,因为它是最后一条记录。

我找到了几篇具有相同要求的帖子,但找不到排除最后一行的帖子。

以下是我保存到的示例数据/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

这会

  • 在处理第一个输入行时,在其他任何内容之前打印一个逗号,后跟一个换行符,以终止“前一行”
  • 打印用单引号括起来的当前行的内容(通过表示八进制 ASCII 码), 但没有逗号或换行符(因为它还不知道需要哪个)
  • 在文件末尾,仅打印一个换行符,以终止与最后一个输入行相对应的输出

答案3

一定要和AWK一起吗? sed 允许直接检查最后一行 ( $),因此您可以使用 删除最后一个逗号$s/,$//

或者,完整地添加引号和逗号并删除最后一行的逗号:

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

或者,通过使用 shell 变量来保存引号字符(因此我们可以通过使用将其交换为单引号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/.$//'

来源

相关内容