无法将制表符分隔的.txt文件转换为csv

时间:2014-11-24 15:03:51

标签: linux csv iconv tr tab-delimited

我正在使用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文件的方法。

感谢。

3 个答案:

答案 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