我有一个大文件,其中包含一些类似于:
的行>m160505_c100980652550000001823221307061611/31156/269-572
我需要用竖条替换所有正斜杠。我认为awk是一种很好的方法 - 它很快且很简单。但是,我不知道如何合并tr和|进入命令。到目前为止,我有以下内容,但我需要帮助来纠正它。
awk '/^>/{tr{/}{|}; next}{print}' < Old.fasta > New.fasta
我并不反对为此编写脚本,但我觉得awk可能是更快的方法。 感谢
答案 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