web-dev-qa-db-ja.com

複数の行をカンマ区切りの1行に変換する(Perl / Sed / AWK)

複数行に次のデータがあります。

foo
bar
qux
zuu
sdf
sdfasdf

私がしたいのは、それらを1行とカンマで区切って変換することです:

foo,bar,qux,zuu,sdf,sdfasdf

それを行うのに最適なUnixのワンライナーは何ですか?

75
neversaint

貼り付けコマンドの使用:

paste -d, -s file
128
Guru

ファイル

aaa
bbb
ccc
ddd

xargs

cat file | xargs

結果

aaa bbb ccc ddd 

xargsが改善されました

cat file | xargs | sed -e 's/ /,/g'

結果

aaa,bbb,ccc,ddd 
63

xargs -a your_file | sed 's/ /,/g'

これは短い方法です。

10

それには多くの方法があります。使用するツールは、主に自分の好みや経験に依存します。

Trコマンドの使用:

tr '\n' ',' < somefile

Awkの使用:

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
9
n3rV3

入力例に基づいて、この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
7
Kent

Perlのワンライナー:

Perl -pe'chomp, s/$/,/ unless eof' file

または、より暗号化したい場合:

Perl '-peeof||chomp&&s/$/,/' file
6
choroba
Perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

これにより、拡張子が.bakの元のファイルのバックアップが作成され、元のファイルが変更されます

1
Vijay
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'
1
protist