web-dev-qa-db-ja.com

sedを使用して各行の最後のスペースをコンマに置き換えてから、すべてのスペースを削除します

2列のスペース区切りの.txtファイルがありますが、最初の列にはスペースがあります(エラーです)。それをcsvに変換する必要がありますが、すべてのスペースをコンマに置き換えることはできません。

入力例:

gi|118592783|ref|ZP_01550172.1|_biphenyl-2  3-diol_1    2-dioxygenase_[Stappia_aggregata_IAM_12614] 1

望ましい出力:

gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1

sed(またはその他)を使用して、行の最後のスペースをコンマに置き換え、残りのスペースをすべて削除するにはどうすればよいですか?それはCSVファイルを効果的に作成しますか?

7
Zoey RW

何かのようなもの:

sed -r 's/(.*) /\1,/; s/ //g'

最初の置換は貪欲で、グループの最後のスペースを除くすべてをカバーし、最後のスペースを,に置き換えます。 2番目は残りを削除します。

8
muru

これは仕事をするでしょう:

sed -r "s/\s([0-9]+$)/,\1/" filename.txt | tr -d ' '

または:

sed -r "s/\s([0-9]+$)/,\1/; s/\s//g" filename.txt

入力例:

gi|118592783|ref|ZP_01550172.1|_biphenyl-2 3-diol_1    2-dioxygenase_[Stappia_aggregata_IAM_12614] 1

出力:

gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
Ravexina

こっけいな方法-sedループを使用します。

  1. パターンにスペースが1つしかない場合は、コンマで置き換えます
  2. (それ以外の場合)最初のスペースを何も置き換えずに1

GNU sedとして次のように記述できます

sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'

テスト:

$ echo 'gi|118592783|ref|ZP_01550172.1|_biphenyl-2  3-diol_1    2-dioxygenase_[Stappia_aggregata_IAM_12614] 1' | 
  sed -e :1 -e '/^[^ ]* [^ ]*$/ s/ /,/' -e 's/ //; t1'
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1
3
steeldriver

Perl

$ Perl -ne 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/;print' input.txt                                                                                    
gi|118592783|ref|ZP_01550172.1|_biphenyl-23-diol_12-dioxygenase_[Stappia_aggregata_IAM_12614],1

以下:

Perl -pe 's/\s//g;s/^(.*)([[:digit:]])$/\1,\2/' input.txt 

事実上、これはmuruのアプローチの反対です。最初にすべてのスペースを取り除き、最後のアイテム(グループ\1)と最後のアイテム(グループ\2、2つは数字)の前にすべてをグループ化します。行をグループ\1\2でコンマで区切って置き換えます。

([[:digit:]])(.)に変更して、必要な場合(つまり、最後のcharが任意のタイプであると予想される場合)に任意の文字を参照するか、または([[:graph:]])を使用して印刷可能な文字のみを扱う

3