2011-10-07 145 views
2

我有一個文件看起來像這樣:刪除分隔符

('chr1', '1499102', '1500297') 
('chr1', '1811177', '1812131') 
('chr1', '2312420', '2313646') 
('chr1', '6683999', '6684724') 

N多行。

我想打印這樣的:

chr1 (tab) 1499102 (tab) 1500297 

任何一個襯套殼或Python或Perl。

+3

到目前爲止你有什麼? – Mat

回答

4

使用python:

for line in open('filename'): print('%s\t%s\t%s'%(eval(line))) 

(當然,你需要這個行Python腳本傳遞給Python解釋:python -c "..."

eval()功能是不是安全,並應如果您打算通過它處理未經驗證的用戶輸入,則視爲「邪惡」。如果這個功能對你真正的威脅,你可以使用這個版本,這是更爲嚴格,其輸入:

import ast 
for line in open('filename'): 
    print('%s\t%s\t%s'%(ast.literal_eval(line))) 

hereast.literal_eval()的文檔)

+0

很高興知道究竟是什麼eval http://docs.python.org/library/functions.html#eval(提示:它不是很安全) – rplnt

+0

@rplnt:是的,我知道eval()不是安全。 OP要求提供單線程,這是最簡單的一種,非常適合一次性處理的需要。然而,我會編輯代碼,以包括一個更安全的版本... –

+0

@Adrien:謝謝。 – Angelo

2

請問SED/AWK爲你工作呢?

awk '{print $1"\t"$2"\t"$3}' your_file_with_stuff_in_it | sed "s/[')(,]//g" 
+2

如果你反正使用'sed',爲什麼不一路走。 'sed -e「s /','/ \ t /」-e「s/^ \\('//」-e「s /'\\)$ //」your_file_with_stuff_in_it' – tripleee

+0

@tripleee,sharp: - ) – imm

4

Perl的一個班輪這裏^ _^

cat file.txt | perl -ni -e "printf qq{%s\t%s\t%s\n}, m/'([^']+)'/g;" 
3
perl -pe "s/\('(.*)', \'([0-9]*)', '([0-9]*)'\)/$1\t$2\t$3/g" yourfile 

的伎倆,我

8
perl -nE '$,="\t"; say eval' file.txt 

利用Perl的輸出記錄分隔符的,$,提供標籤。 eval應該可以安全地使用單引號字符串,並且可能是最好的選擇。

+1

作爲有效的Perl代碼,每一行都很好而且聰明。 –

2
awk -F "'" 'BEGIN {OFS="\t"} {print $2, $4, $6}' FILE