我正在使用tr将制表符分隔的.txt文件转换为逗号分隔的csv文件。这是我的文件输出
arron@arron-Ideapad-Z570 ~/Phd $ cat test_pph_s.txt | cut -f 1,2,3
#o_acc o_pos o_aa1
ENSG00000145888 455 H
ENSG00000145888 450 R
ENSG00000145888 440 M
ENSG00000145888 428 R
ENSG00000145888 428 R
这里是完整的文件链接https://drive.google.com/file/d/0B0iDswLYaZ0zV3ktekhyeGxwTlk/view?usp=sharing
并尝试使用tr:
交换逗号空格arron@arron-Ideapad-Z570 ~/Phd $ cat test_pph_s.csv | cut -f 1,2,3 | tr "\\t" ","
#o_acc , o_pos,o_aa1
ENSG00000145888 , 455, H
ENSG00000145888 , 450, R
ENSG00000145888 , 440, M
ENSG00000145888 , 428, R
ENSG00000145888 , 428, R
似乎只是添加逗号而不删除空格。
但是我注意到如果我在libreoffice中打开.txt文件并保存为.csv,它会转换为utf8格式然后运行
arron@arron-Ideapad-Z570 ~/Phd $ cat test_pph_s.csv | cut -f 1,2,3 | tr "\\t" ","
给了我
#o_acc,o_pos,o_aa1
ENSG00000145888,455,H
ENSG00000145888,450,R
ENSG00000145888,440,M
ENSG00000145888,428,R
ENSG00000145888,428,R
这就是我想要的。
我在第一次尝试时做错了什么?在我看来,使用tr不是"正确"转换为.csv文件的方法。感谢。
答案 0 :(得分:1)
似乎你有标签和空格的混合
cut -f 1,2,3 < input.txt | tr -s [:blank:] ','
此处tr
会将所有空格折叠为单个字符,然后用逗号替换它。你也不需要cat
,但如果你愿意的话,你可以使用它:)
答案 1 :(得分:0)
我无法使用iconv进行复制,无法在ascii和utf8之间进行转换。我不确定libreoffice正在做什么,你在每条记录的前面都有额外的字符。尝试使用awk完成同样的事情,看看它是否有更好的成功:
awk -F'\t' 'BEGIN {OFS=","} {print $1, $2, $3}' test_pph_s.csv
这是以制表符分隔的文件-F'\t'
并输出以逗号分隔的OFS=','
答案 2 :(得分:0)
带有while read
循环的简单bash脚本可以简单地处理它。在这里,您只需读入文件中的所有数据字段,然后输出您感兴趣的数据,用逗号分隔。第一个参数是要读取的文件名(只是默认为您的测试文件)。如果您愿意,还可以包含传递输出文件名的第二个参数,并将输出重定向到该文件名。下面的脚本,只是使用字段名称作为变量来保存读取时每个字段的值,然后输出所请求的值(您可以使用任何您喜欢的变量名称,我只是发现保留字段名称更容易):
#!/bin/bash
fn="${1:-dat/test_pph_s.txt}"
while read o_acc o_pos o_aa1 o_aa2 rsid acc pos aa1 aa2 prediction pph2_prob pph2_FPR pph2_TPR ||
[ -n "$pph2_TPR" ]; do
printf "%s,%s,%s\n" "$o_acc" "$o_pos" "$o_aa1"
done <"$fn"
exit 0
<强>输出:强>
$ bash tab2csv.sh
#o_acc,o_pos,o_aa1
ENSG00000145888,455,H
ENSG00000145888,450,R
ENSG00000145888,440,M
ENSG00000145888,428,R
ENSG00000145888,428,R
ENSG00000145888,413,R
ENSG00000145888,412,M
ENSG00000145888,406,S
ENSG00000145888,402,P