列の数百の数字をカンマ区切りの行に変換

列の数百の数字をカンマ区切りの行に変換

列から次のものをどのように変換できますか?

1
2
3
4
5
6
.
.
.
.
98
99
100

カンマで区切られた行で:

1,2,3,4,5,6,....,98,99,100

私はLinuxを使用しています。

答え1

paste次のようにコマンドを使用できます。

paste -sd, file.txt

デフォルトでは、paste「各ファイルの順番に対応する行で構成されるタブで区切られた行を標準出力に書き込みます」(マニュアルから引用)。この-dオプションは代替出力区切り文字を設定し、この-sオプションを使用すると、並列ではなく一度に1つのファイルを貼り付けることができます。単一ファイルの場合、このオプションはファイルを一度に1行ずつ処理します。

答え2

以下はいくつかの方法です(たとえルイックのpaste方法おそらく最高です):

  • tr

    $ tr '\n' , < file
    1,2,3,4,5,6,.,.,.,.,98,99,100,$
    

    これにより、すべての改行がコンマに変わりますが、これは最後の改行も変更されるため、再度追加する必要があります(これはGNUを想定していますが、sed通常Linuxシステムでは改行です)。

    $ tr '\n' , < file | sed 's/,$/\n/'
    1,2,3,4,5,6,.,.,.,.,98,99,100
    
  • パール&sed

    $ perl -pe 's/\n/,/' file | sed 's/,$/\n/'
    1,2,3,4,5,6,.,.,.,.,98,99,100
    
  • Perlのみを使う

    $ perl -lne 'push @l,$_; END{print join ",",@l; }' file 
    1,2,3,4,5,6,.,.,.,.,98,99,100
    

    または:

    $ perl -0777 -pe 's/\n/,/g; s/,$/\n/;' file 
    1,2,3,4,5,6,.,.,.,.,98,99,100
    

    -0777Perlにファイルを「フルルック音を出し」、ファイル全体をメモリに読み込むように指示します。次に、すべての改行文字をコンマで置き換え、最後のカンマを改行文字に置き換えます。方法-peアプリケーション-e」。

    どちらの方法もファイル全体をメモリに保存するため、非常に大きなファイルには適していない可能性があります。

  • awk&sed

    $ awk -v ORS="," '1' file | sed 's/,$/\n/'
    1,2,3,4,5,6,.,.,.,.,98,99,100
    
  • 純粋ですawk(ありがとうございますエドモートンコメントでこの方法を提供した人)

    $ awk '{printf "%s%s", sep, $0; sep=","} END{print ""}' file 
    1,2,3,4,5,6,.,.,.,.,98,99,100
    

    1「印刷」の略語です。 awkでは、何かがtrueと評価されると、デフォルトの動作は現在の行を印刷するため、常にtrueである1ためよく使用されます。1

答え3

GNUの使用datamash:

$ datamash -t , transpose <file
1,2,3,4,5,6,.,.,.,.,98,99,100

また、次のように構成されている場合、データは正しく転置されます。多くの種類カンマで区切られた列(例:シンプルCSV形式):

$ cat f
1,1,1,1
2,2,2,2
3,3,3,3
4,4,4,4
5,5,5,5
6,6,6,6
.,.,.,.
.,.,.,.
.,.,.,.
.,.,.,.
98,98,98,98
99,99,99,99
100,100,100,100
$ datamash -t , transpose <f
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100

答え4

sed完全性のために、解決策は次のとおりです。

% cat =commas
#!/bin/bash

# Other ways of doing it:
#sed -n 'H;${g;s/\n//;s//,/g;p}'
#sed -n '1h;1!H;${g;s/\n/,/g;p}'

sed ':b;N;$!bb;s/\n/,/g'

しかし、私はLoïcのpasteソリューションを使い始めるようです。

関連情報