95

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

foo
bar
qux
zuu
sdf
sdfasdf

私がやりたいことは、それらを1つのカンマ区切りの行に変換することです:

foo,bar,qux,zuu,sdf,sdfasdf

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

4

8 に答える 8

82

ファイル

aaa
bbb
ccc
ddd

xargs

cat file | xargs

結果

aaa bbb ccc ddd 

xargs の改善

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

結果

aaa,bbb,ccc,ddd 
于 2013-07-20T06:47:20.930 に答える
11

それを達成する方法はたくさんあります。使用するツールは、主に自分の好みや経験によって異なります。

tr コマンドの使用:

tr '\n' ',' < somefile

awk の使用:

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
于 2013-04-02T08:14:33.123 に答える
10

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

これはより短い方法です。

于 2013-08-24T14:23:21.790 に答える
7

入力例に基づいて、この 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
于 2013-04-02T08:20:27.683 に答える
6

Perl ワンライナー:

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

または、より不可解になりたい場合は、次のようにします。

perl '-peeof||chomp&&s/$/,/' file
于 2013-04-02T08:15:20.383 に答える
2
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'
于 2013-05-29T18:38:18.680 に答える
1
perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

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

于 2013-04-02T10:19:12.317 に答える