printf 'abc\npqrs\nxyz\n' | awk $'{ print "\'" $0 "\'" ,sep="," ,ORS=""}'
出力:'abc' , 'pqrs' , 'xyz' ,
期待される出力:コンマ(、)の最後/末尾を削除し、スペースを削除します。
答え1
awkを使用して、一度に1行の入力のみをメモリに保存します。
$ 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 -
csvformat
CSV認識ツールを使用してください。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'