使用 awk 将单独行上的 abc pqrs xyz 转换为单行上的 'abc','pqrs','xyz'

使用 awk 将单独行上的 abc pqrs xyz 转换为单行上的 'abc','pqrs','xyz'
printf 'abc\npqrs\nxyz\n' | awk $'{ print "\'" $0 "\'" ,sep="," ,ORS=""}'

输出:'abc' , 'pqrs' , 'xyz' ,

预期输出:删除逗号(,)的最后/末尾并删除空格。

答案1

使用任何 awk 并且一次只在内存中存储一​​行输入:

$ printf 'abc\npqrs\nxyz\n' |
    awk '{printf "%s\047%s\047", sep, $0; sep=","} END{print ""}'
'abc','pqrs','xyz'

即使输入行为空,上面的代码也将继续工作:

$ printf 'abc\n\npqrs\nxyz\n' |
    awk '{printf "%s\047%s\047", sep, $0; sep=","} END{print ""}'
'abc','','pqrs','xyz'

答案2

以下假设您需要正确引用的 CSV 行,并考虑到您可能在数据中嵌入了单引号或逗号:

csvformat -d $'\n' -Q "'" -U1 | paste -d, -s -

它使用 CSV 感知csvformat工具csvkit适当地格式化数据,使用单引号作为引用字符,引用所有字段,甚至那些不需要引用的字段(删除-U1以仅引用需要引用的字段)。这些行被读取为单个换行符分隔的字段。

然后使用该paste实用程序将数据重塑为单行,字段之间用逗号分隔。

测试:

$ printf '%s\n' "It's the first" "The middle" "And, the last" | csvformat -d $'\n' -Q "'" -U1 | paste -d, -s -
'It''s the first','The middle','And, the last'

答案3

对于足够小的输入,使其不会溢出xargs缓冲区,这里有一个非awk建议:

printf 'abc\npqrs\nxyz\n' | xargs | sed -e "s/ /','/g" -e "s/\(.*\)/'\1'/"

输出

'abc','pqrs','xyz'

这是一个强制性awk版本

printf 'abc\npqrs\nxyz\n' |
    awk "END {printf \"'\\n\"} NR==1 {printf \"'%s\", \$0} NR>1 {printf \"','%s\", \$0}"

输出

'abc','pqrs','xyz'

答案4

使用 awk 的更简单的解决方案:

$ printf 'abc\npqrs\nxyz\n' | 
  awk 'BEGIN{q="\047"}  { printf c q "%s" q , $0 ; c=","}END{print "" }'

'abc','pqrs','xyz'

相关内容