複数行に次のデータがあります。
foo
bar
qux
zuu
sdf
sdfasdf
私がしたいのは、それらを1行とカンマで区切って変換することです:
foo,bar,qux,zuu,sdf,sdfasdf
それを行うのに最適なUnixのワンライナーは何ですか?
貼り付けコマンドの使用:
paste -d, -s file
aaa
bbb
ccc
ddd
cat file | xargs
aaa bbb ccc ddd
cat file | xargs | sed -e 's/ /,/g'
aaa,bbb,ccc,ddd
xargs -a your_file | sed 's/ /,/g'
これは短い方法です。
それには多くの方法があります。使用するツールは、主に自分の好みや経験に依存します。
Trコマンドの使用:
tr '\n' ',' < somefile
Awkの使用:
awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
入力例に基づいて、このawk行は機能します。 (末尾のコンマなし)
awk -vRS="" -vOFS=',' '$1=$1' file
テスト:
kent$ echo "foo
bar
qux
zuu
sdf
sdfasdf"|awk -vRS="" -vOFS=',' '$1=$1'
foo,bar,qux,zuu,sdf,sdfasdf
Perlのワンライナー:
Perl -pe'chomp, s/$/,/ unless eof' file
または、より暗号化したい場合:
Perl '-peeof||chomp&&s/$/,/' file
Perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file
これにより、拡張子が.bakの元のファイルのバックアップが作成され、元のファイルが変更されます
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'