【问题标题】:Removing delimiters删除分隔符
【发布时间】:2011-10-07 10:46:03
【问题描述】:

我有一个如下所示的文件:

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

N 行数。

我想这样打印:

chr1 (tab) 1499102 (tab) 1500297

任何一种衬里 shell 或 python 或 perl。

【问题讨论】:

  • 到目前为止你有什么?

标签: python perl shell


【解决方案1】:
perl -nE '$,="\t"; say eval' file.txt

利用 perl 的输出记录分隔符 $, 来提供选项卡。 eval 应该可以安全地用于单引号字符串,并且可能是最好的选择。

【讨论】:

  • 将每一行都作为有效的 Perl 代码进行漂亮而巧妙的评估。
【解决方案2】:

使用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)))

(here 是 ast.literal_eval() 的文档)

【讨论】:

  • 很高兴知道 eval 到底是做什么的 docs.python.org/library/functions.html#eval(提示:这并不安全)
  • @rplnt:是的,我知道 eval() 根本不安全。 OP 要求使用单线,这是最简单的,非常适合一次性处理的需要。但是,我将编辑代码以包含一个更安全的版本...
【解决方案3】:

这里是 Perl 单行 ^_^

cat file.txt | perl -ni -e "printf qq{%s\t%s\t%s\n}, m/'([^']+)'/g;"

【讨论】:

    【解决方案4】:
    perl -pe "s/\('(.*)', \'([0-9]*)', '([0-9]*)'\)/$1\t$2\t$3/g" yourfile
    

    帮我搞定了

    【讨论】:

      【解决方案5】:

      sed/awk 也适合你吗?

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

      【讨论】:

      • 如果你仍然使用sed,为什么不一路走下去。 sed -e "s/', '/\t/" -e "s/^\\('//" -e "s/'\\)$//" your_file_with_stuff_in_it
      【解决方案6】:
      awk -F "'" 'BEGIN {OFS="\t"} {print $2, $4, $6}' FILE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 1970-01-01
        • 2016-01-21
        相关资源
        最近更新 更多