![如何在一行中的第一个逗号之后格式化 csv 格式的文件?](https://linux22.com/image/158081/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%80%E8%A1%8C%E4%B8%AD%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%80%97%E5%8F%B7%E4%B9%8B%E5%90%8E%E6%A0%BC%E5%BC%8F%E5%8C%96%20csv%20%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个以下格式的文件:
原始格式
ARX_10/model2,CEECCCCCHHHHSCSCCCSSCCCSCCCSSCSTTTCEEEETTTEECGGGTTTEEEEEETTTTEEEEEECSCCGGGCSCEEEEESSSSSSCEEEEEECCCCSCGGGCCCCBCCSCEECCTTCCEEEEEECCTHHHHHCCCCCCCSTTHHHHHHHHSSCCSTTTTTTTTTSSGGGTTTEEEEEETTTTEEEEEECSCCTTSCCCCCCCSCSSCCCCCCCEECCCSSCCBCCSEEECCTTCEEEEEEECCSSSSSSCCEEECSSSSSSCCCEESSCSSSBCCEECTTSCEEEEEEECTTSSTTSEEEEEESSCGGGCCEEEEEEESSCCCSCCCCCCCCCCSSSHHHHHHHHCCCCSCCCTTTSCCSCCCSTTTCEEEETTTEECGGGTTTEEEEEETTTTEEEEEECSCCGGGCSCEEEEESSSSSSCEEEEEECCCCSCGGGCCCCBCCSCEECCTTCCEEEEEECCTCSEEEEESSCGGGCCEEEEEEESSSCCCCCCCCCCCCHHHHHHHHHHHSSSSCCCCCCSSCCSSCCCSCCCCCCSSCCSSCCCSCCCCCCSSSCCC
ARX_10/model3,CTTSCCCTTTTTSEEEEECGGGSCEEEEECCCSSBCCCSCCCCCTTTCCCCCCCCSCBCCCCCCCCSBCCCCTTCEEEEEECCCCTTCCSCEEEEECCSSSCEEEEETTTEECGGGBTTBCCEECCSSSCCEEEEEESCCGGGSEEEEEEESSTTSSCEEEEEECCCCCCCSEEECCSSCCBCCCCBCCHHHHSSCEEEEEBCSSSCBCCSEETTTEECGGGTTTEEEEEETTTTEEEEEECSCCGGGCSBEEEEESSTTSCCCBCCEEECSSCCCCSCCCCCCCSCBCCCSSCCCCCCCCCCHHHHHSCCEEEEECCSTTCCEEEEEETTSCCSCHHHHHHHHHHHHHSSSCCHHHHHHHHHHHCSSCTTCCCCCCTTTCCTTSCCCCCCCSBCEECCSSCTTTTCCCBCCBCCCSSCCCCSCCEEECCSSCEEEEEEECCSSSSSSCCEEECSSSSSCCCCCCSSCSSSBCCBCCSSSCEEEEEEECCCSGGGCSEEEEESSCGGGCCEEEEEEESSSCCCCCCCCCCCCHHHHHHHHHHHSSSSCCCCCCSSCCSSCCC
上面是文件内容的前两行的示例。前两行之后的每一行的格式与提供的示例相同。第一个空格是已处理文件的名称(长度可以根据原始文件的名称而变化,例如 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
解释:
将模式空间分为两部分,分别对它们进行操作,然后将它们合并在一起。
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 设置为 ',' 拆分为标签和字符串以进行转换
- 从行开始逐行读取
- 让 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==> 文件名