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'