我想将它们括在单/双引号中并以逗号结尾。但我还需要它,以便最后一行不包含逗号,因为它是最后一条记录。
我找到了几篇具有相同要求的帖子,但找不到排除最后一行的帖子。
以下是我保存到的示例数据/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'