在awk中使用tr命令用垂直条替换正斜杠

时间:2016-08-05 01:32:37

标签: perl awk tr

我有一个大文件,其中包含一些类似于:

的行
>m160505_c100980652550000001823221307061611/31156/269-572 

我需要用竖条替换所有正斜杠。我认为awk是一种很好的方法 - 它很快且很简单。但是,我不知道如何合并tr和|进入命令。到目前为止,我有以下内容,但我需要帮助来纠正它。

awk '/^>/{tr{/}{|}; next}{print}' < Old.fasta > New.fasta

我并不反对为此编写脚本,但我觉得awk可能是更快的方法。 感谢

3 个答案:

答案 0 :(得分:4)

tr没有protocol Task { func execute() } class SimpleTask<T>: Task { let parameter: T init(parameter: T) { self.parameter = parameter } func execute() { print("executing task with parameter: \(parameter)") } } func executeTask(task: Task) { task.execute() } let simpleTask = SimpleTask<Int>(parameter: 1) executeTask(simpleTask) 命令/功能,也没有 easy 方式来获得相同的效果。既然你标记了这个“perl”,我假设你也对perl oneliner开放:

awk

做的事与awk看起来正在尝试做的事情相同;在以tr开头的行上将所有perl -lpe '/^>/ and tr{/}{|}' < Old.fasta > New.fasta 替换为/

答案 1 :(得分:1)

sed在这里可能最简单:

$ sed '/^>/ s/\//|/g' <<<'>m160505_c100980652550000001823221307061611/31156/269-572'
>m160505_c100980652550000001823221307061611|31156|269-572
  • 在一行开头(>)匹配^后,将(正式)分隔符/.../中包含的正则表达式与

  • 匹配
  • s/\//|/g为每个{s} |替换g /(转义为\/,因为{ {1}}用作正则表达式分隔符。

为清晰起见使用备用分隔符/@

使用sed s'/^>/ s@/@|@g'的{​​{1}}函数,与单独的tr实用程序类似的变体:

sed
  • 函数y将第一个参数中的任何字符替换为第二个参数中的对应的字符 - 请注意,这意味着第1个和第2个参数参数必须具有相同的长度sed '/^>/ y/\//|/' <<<'>m160505_c100980652550000001823221307061611/31156/269-572' 不要求这样做。)

答案 2 :(得分:1)

$ awk '/^>/{gsub("/","|")}1' file
>m160505_c100980652550000001823221307061611|31156|269-572

如果您在awk中需要一个tr()函数,则必须编写它,例如:

$ cat tr.awk
function tr(oldStr,oldList,newList,     newStr,i,o2n,chr) {
    for (i=1; i<=length(oldList); i++) {
        o2n[substr(oldList,i,1)] = substr(newList,i,1)
    }
    for (i=1; i<=length(oldStr); i++) {
        chr = substr(oldStr,i,1)
        newStr = newStr (chr in o2n ? o2n[chr] : chr)
    }
    return newStr
}
{ print $0, "->", tr($0,"xyz","123") }

$ echo 'axbyczd' | awk -f tr.awk
axbyczd -> a1b2c3d