行の最初のカンマの後にcsv形式のファイルをフォーマットする方法は?

行の最初のカンマの後にcsv形式のファイルをフォーマットする方法は?

次の形式のファイルがあります。

オリジナルフォーマット

ARX_10/model2,CEECCCCCHHHHSCSCCCSSCCCSCCCSSCSTTTCEEEETTTEECGGGTTTEEEEEETTTTEEEEEECSCCGGGCSCEEEEESSSSSSCEEEEEECCCCSCGGGCCCCBCCSCEECCTTCCEEEEEECCTHHHHHCCCCCCCSTTHHHHHHHHSSCCSTTTTTTTTTSSGGGTTTEEEEEETTTTEEEEEECSCCTTSCCCCCCCSCSSCCCCCCCEECCCSSCCBCCSEEECCTTCEEEEEEECCSSSSSSCCEEECSSSSSSCCCEESSCSSSBCCEECTTSCEEEEEEECTTSSTTSEEEEEESSCGGGCCEEEEEEESSCCCSCCCCCCCCCCSSSHHHHHHHHCCCCSCCCTTTSCCSCCCSTTTCEEEETTTEECGGGTTTEEEEEETTTTEEEEEECSCCGGGCSCEEEEESSSSSSCEEEEEECCCCSCGGGCCCCBCCSCEECCTTCCEEEEEECCTCSEEEEESSCGGGCCEEEEEEESSSCCCCCCCCCCCCHHHHHHHHHHHSSSSCCCCCCSSCCSSCCCSCCCCCCSSCCSSCCCSCCCCCCSSSCCC
ARX_10/model3,CTTSCCCTTTTTSEEEEECGGGSCEEEEECCCSSBCCCSCCCCCTTTCCCCCCCCSCBCCCCCCCCSBCCCCTTCEEEEEECCCCTTCCSCEEEEECCSSSCEEEEETTTEECGGGBTTBCCEECCSSSCCEEEEEESCCGGGSEEEEEEESSTTSSCEEEEEECCCCCCCSEEECCSSCCBCCCCBCCHHHHSSCEEEEEBCSSSCBCCSEETTTEECGGGTTTEEEEEETTTTEEEEEECSCCGGGCSBEEEEESSTTSCCCBCCEEECSSCCCCSCCCCCCCSCBCCCSSCCCCCCCCCCHHHHHSCCEEEEECCSTTCCEEEEEETTSCCSCHHHHHHHHHHHHHSSSCCHHHHHHHHHHHCSSCTTCCCCCCTTTCCTTSCCCCCCCSBCEECCSSCTTTTCCCBCCBCCCSSCCCCSCCEEECCSSCEEEEEEECCSSSSSSCCEEECSSSSSCCCCCCSSCSSSBCCBCCSSSCEEEEEEECCCSGGGCSEEEEESSCGGGCCEEEEEEESSSCCCCCCCCCCCCHHHHHHHHHHHSSSSCCCCCCSSCCSSCCC

上記は、ファイルの内容の最初の2行の例です。最初の2行の後の各行は、提供された例と同じ形式を持ちます。最初のスペースは、処理されたファイルの名前(長さは元のファイルの名前によって異なります(例:ARX、HOXA13、PABPN1、ARX_PA1など))、その後にファイルを区切る文字チェーンが続きます。名前はカンマで区切ります。

私にとって必要なのは、タイトルを引用符で囲み、名前の後の各文字をカンマで区切って、行の末尾にカンマを持たないcsv形式にこの生形式を変換する方法を学ぶことです。

出力例:

"ARX_10/model2","C","E","E","C","C","C","C","C","H","H","H", ...
"ARX_10/model3","C","T","T","S","C","C","C","T","T","T","T", ...

ご協力ありがとうございます。

答え1

@Philliposの推薦に基づいて:

sed 'h;s/.*,//;s/./,"&"/g;x;G;s/,.*\n/"/;s/^/"/' inp.csv 

説明する:

パターン空間を2つの部分に分割し、別々に作業してから一緒にマージします。

perl -lpe '$_ = q["] . join(q[","], unpack sprintf "A%dx(A)*", index $_, ",") . q["]' inp.csv

簡単な説明:

° Construct the unpacking format for the input line by finding the location position of the comma, skip the comma from unpack, remaining are unpacked a char each. Then joined with the string ",", finally all enclosed in double quotes. 

答え2

これがあなたが探しているものかもしれません:

$ awk -F, -v OFS= '{$1="\""$1"\""; gsub(/./,",\"&\"",$2)} 1' file
"AModel_10/model1","A","A","A"
"ABCDEFGModel_11/model1","B","B","B"

上記はこの入力に対して実行されました。

$ cat file
AModel_10/model1,AAA
ABCDEFGModel_11/model1,BBB

答え3

IFS=, ; while read label string; do echo "\"$label\",$(echo $string| sed -e 's/\(.\)/\"\1\",/g' -e 's/,$//') "; done < inputfile

  • IFSを ','に設定して変換するタグと文字列に分割
  • 行から始めて1行ずつ読みます。
  • sedに「.」(=各文字)を「char」、「...」に置き換えます。
  • 行末の「,」を削除します。

答え4

次のコマンドを使用してテストすると、うまく動作します。

注文する

for i in `cat o.txt`; do j=`echo $i | awk -F "," '{print $1}'`; echo $i | awk -F "," '{print $2}'| sed 's/\(.\)/"&",/g'| awk -v j="$j" '{print j","$0}'| sed 's/^/"/g'| sed 's/,/"&/1'| sed 's/,$//g'; done

ここで o.txt==> ファイル名

関連情報