2014-11-24 145 views
0

我正在使用tr將製表符分隔的.txt文件轉換爲逗號分隔的csv文件。下面是我的文件輸出無法將製表符分隔的.txt文件轉換爲csv

[email protected] ~/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掉了逗號空白:

[email protected] ~/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格式,然後運行

[email protected] ~/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

csv =逗號分隔值,如果你的文件是製表符分隔,那麼它不是一個csv,它是一個製表符分隔的文本文件。 當通過應用程序將文檔保存爲csv時,它將用逗號分隔這些值,這是合適的csv。 你的第一步說你正在轉換爲一個「製表符分隔的csv」,這與自身相矛盾,這可能是導致命令行問題的原因。 – 2014-11-24 15:10:00

+0

嗨@SO。這是真的,而我也是馬虎。然而,只是在.txt文件中嘗試這樣做會得到相同的結果。我將編輯我的問題 – brucezepplin 2014-11-24 15:20:05

+0

我不相信這是馬虎。術語「csv」通常用於包含由某些字符分隔的字段的文件,儘管RFC4180標準,該字符可以是也可以不是逗號。 – JNevill 2014-11-24 15:34:53

回答

1

看來你有製表符和空格

cut -f 1,2,3 < input.txt | tr -s [:blank:] ',' 

這裏的搭配會將所有空白區域合併爲一個字符,然後用逗號替換它。你也不需要cat,但你可以使用它,如果你喜歡這種方式:)

+0

我明白了。我想我從一個簡單的tr「」命令問得太多了。認爲它會處理任何空白。非常感謝。 – brucezepplin 2014-11-24 19:05:10

0

我無法使用iconv在ascii和utf8之間進行轉換。我不確定libreoffice在做什麼,因爲你在每條記錄的前面都得到了額外的字符。嘗試使用awk來完成同樣的事情,看看它是否有更好的成功:

awk -F'\t' 'BEGIN {OFS=","} {print $1, $2, $3}' test_pph_s.csv 

這是採取在製表符分隔文件-F'\t'和輸出逗號分隔OFS=','

+0

嗨JNevill - 我仍然得到相同的結果。我在文章中添加了文件鏈接。你能否在你身邊檢查?顯然有一些我錯過了! – brucezepplin 2014-11-24 15:49:57

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 
相關問題