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ファイルを効果的に作成しますか?
何かのようなもの:
sed -r 's/(.*) /\1,/; s/ //g'
最初の置換は貪欲で、グループの最後のスペースを除くすべてをカバーし、最後のスペースを,
に置き換えます。 2番目は残りを削除します。
これは仕事をするでしょう:
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
こっけいな方法-sedループを使用します。
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
$ 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:]])
を使用して印刷可能な文字のみを扱う