列から次のものをどのように変換できますか?
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
-0777
Perlにファイルを「フルルック音を出し」、ファイル全体をメモリに読み込むように指示します。次に、すべての改行文字をコンマで置き換え、最後のカンマを改行文字に置き換えます。方法-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
ソリューションを使い始めるようです。