如何使用 awk 打印值之间的引号

Pau*_*aul 2 awk field separator output

我有一个文件

A|B|C|D|E|F
Run Code Online (Sandbox Code Playgroud)

我需要像这样的输出

"A","B","C","D","E","F"
Run Code Online (Sandbox Code Playgroud)

我做了:

awk -f'|' '{print $1,$2,$3}'
Run Code Online (Sandbox Code Playgroud)

这给了我只有空格的输出。我的问题是如何使用引号获取逗号分隔的输出,以及如何在不输入的情况下一次打印所有值'{print $1,$2,$3......}'

我可以:

awk -f'|' '{print """"$1""""","""""$2""""","""""$3""""..}'
Run Code Online (Sandbox Code Playgroud)

但这不起作用。

Ben*_* W. 5

要指定字段分隔符,您必须使用;-F来代替 -f要更改输出的字段分隔符,您必须更改变量OFS(输出字段分隔符)。

字段周围的引号,您可以循环所有字段并添加它们:

$ awk -F"|" -v OFS="," '{for (i=1; i<=NF; ++i){$i="\""$i"\""}}1' infile
"A","B","C","D","E","F"
Run Code Online (Sandbox Code Playgroud)

或者,使用 sed:

$ sed 's/\([^|]*\)/"\1"/g;y/|/,/' infile
"A","B","C","D","E","F"
Run Code Online (Sandbox Code Playgroud)

这用引号将所有非管道字符序列括起来,然后用逗号替换所有管道。


Ed *_*ton 5

惯用的 awk 解决方案是告诉 awk 输入字段分隔符 (FS) 是什么以及您希望输出字段分隔符 (OFS) 是什么,然后简单地更新一个字段,以便 awk 将所有 FS 转换为 OFS。

所以可能是这样的:

$ awk -F'|' -v OFS='","' '{$1=$1; print "\"" $0 "\""}' file
"A","B","C","D","E","F"
Run Code Online (Sandbox Code Playgroud)

或这个:

$ awk -F'|' -v OFS='","' '{$1=$1; gsub(/^|$/,"\"")} 1' file
"A","B","C","D","E","F"
Run Code Online (Sandbox Code Playgroud)

或@karakfa的替代方案/sf/answers/2492515301/或各种其他类似的解决方案。