次の形式のファイルがあります。
オリジナルフォーマット
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==> ファイル名