Pau*_*ogl 1 sed bioinformatics
我发现这个有趣的命令:
grep -v '^>' test.fasta | tr -d '\n' | sed -e 's/\(.\)/\1\n/g' | sort | uniq -c | sort -rn
Run Code Online (Sandbox Code Playgroud)
我对它的含义有所了解(它计算文本文件中的字母),但我的问题是这样的:
sed -e 's/\(.\)/\1\n/g'
Run Code Online (Sandbox Code Playgroud)
我知道它由三个替代命令组成。一种是替换换行符(\n
),即匹配除换行符(\(.\)
)之外的任何字符,但我迷失了/\1\
?
Kus*_*nda 17
命令
sed -e 's/\(.\)/\1\n/g'
Run Code Online (Sandbox Code Playgroud)
是一个 GNUsed
替换命令,它将每个字符替换为自身,后跟换行符。这样做的效果是将输入折叠成单个字符的单列。
$ echo hello | sed -e 's/\(.\)/\1\n/g'
h
e
l
l
o
Run Code Online (Sandbox Code Playgroud)
这\(.\)
是一个“捕获组”,捕获单个字符。这\1
是对第一个捕获组的“反向引用”。在替换文本中使用\1
将插入第一个括号捕获的任何内容。
它也可以写成没有那么多反斜杠,例如
sed 's/./&\n/g'
Run Code Online (Sandbox Code Playgroud)
其中&
仅表示“表达式匹配的任何内容”。
该sed
命令要求 GNUsed
作为标准,sed
不能\n
像这样插入换行符。
要使用标准工具更有效地完成此操作,请使用
fold -w 1
Run Code Online (Sandbox Code Playgroud)
反而。这更有效,因为输入中的每个字符不需要正则表达式匹配。
使用fold
,您的管道可以编写
grep -v '^>' file | tr -d '\n' | fold -w 1 | sort | uniq -c | sort -rn
Run Code Online (Sandbox Code Playgroud)
或者,使用awk
来摆脱该管道的几个步骤,
grep -v '^>' file | tr -d '\n' | fold -w 1 | sort | uniq -c | sort -rn
Run Code Online (Sandbox Code Playgroud)
该awk
代码计算每个字符出现的次数。count
它通过递增与输入流中每个字符对应的数组中的值来实现这一点。输入结束时,输出计数和字符计数的摘要。
sch*_*ity 11
我希望这能让事情变得更清楚。
“我知道它是由三个替代命令组成的”
这只是一个替代命令(如果您指的是该sed
命令):,s/<pattern to search>/<replacement>/
它将执行以下命令:
<pattern>
并将其替换为<replacement>
。g
标志意味着全局执行此操作,因为默认情况下sed
仅替换第一次出现的<pattern>
.“但我迷失了
/\1\
”
\(<pattern>\)
您可以通过使用转义括号或仅使用-E
选项括起来来捕获模式(<pattern>)
。
在<replacement>
本节中,捕获的模式由反斜杠和数字 引用\<number>
。该数字指的是捕获的位置,因为您可以有多个:
sed -E '/(<first capture>)(<second capture>)/\1\2/'
Run Code Online (Sandbox Code Playgroud)
所以该命令的sed -e 's/\(.\)/\1\n/g'
意思是:
\(.\)
并用其自身和新行替换它\1\n
。g
,全局执行,不要在第一次出现时停止。例如:
sed -E '/(<first capture>)(<second capture>)/\1\2/'
Run Code Online (Sandbox Code Playgroud)
-e
此处不需要这些选项,除非您要连接多个sed
命令:sed -e '...' -e '...'
等。
您可以在反向引用和子表达式中找到更多信息。