我发现了这个有趣的命令:
grep -v '^>' test.fasta | tr -d '\n' | sed -e 's/\(.\)/\1\n/g' | sort | uniq -c | sort -rn
我对它的含义有所了解(它计算文本文件中的字母),但我的问题是关于这个:
sed -e 's/\(.\)/\1\n/g'
我知道它由三个替代命令组成。一种是替换换行符(\n
),一个匹配除换行符(\(.\)
)之外的任何字符,但我迷路了/\1\
?
我发现了这个有趣的命令:
grep -v '^>' test.fasta | tr -d '\n' | sed -e 's/\(.\)/\1\n/g' | sort | uniq -c | sort -rn
我对它的含义有所了解(它计算文本文件中的字母),但我的问题是关于这个:
sed -e 's/\(.\)/\1\n/g'
我知道它由三个替代命令组成。一种是替换换行符(\n
),一个匹配除换行符(\(.\)
)之外的任何字符,但我迷路了/\1\
?
命令
是一个单一的 GNU
sed
替换命令,用它自己替换每个字符,后跟一个换行符。这样做的效果是将输入折叠成单个字符的单列。这
\(.\)
是一个“捕获组”,捕获单个字符。这\1
是对第一个捕获组的“反向引用”。在替换文本中使用\1
将插入第一个括号捕获的任何内容。它也可以写成没有那么多反斜杠
其中
&
仅表示“表达式匹配的任何内容”。该
sed
命令要求 GNUsed
作为标准sed
不能插入换行符\n
。要使用标准工具更有效地做到这一点,请使用
反而。这更有效,因为输入中的每个字符都不需要正则表达式匹配。
使用
fold
,您的管道可以写成或者,使用
awk
摆脱该管道的几个步骤,该
awk
代码计算每个字符被看到的次数。它通过增加与count
输入流中每个字符对应的数组中的值来实现这一点。在输入结束时,输出计数和计数的字符的摘要。我希望这能让它更清楚。
它只是一个替代命令(如果您指的是
sed
命令)s/<pattern to search>/<replacement>/
:,它将执行以下命令:<pattern>
并将其替换为<replacement>
.g
标志表示全局执行,因为默认情况下仅sed
替换第一次出现的<pattern>
.您可以通过使用转义括号将其包围来捕获模式
\(<pattern>\)
,或者使用-E
选项仅使用括号来捕获模式(<pattern>)
。在该
<replacement>
部分中,此捕获的模式由反斜杠和数字引用,\<number>
. 该数字是指捕获的位置,因为您可以有几个:所以命令的
sed -e 's/\(.\)/\1\n/g'
意思是:\(.\)
并用它自己和一个新行替换它\1\n
。g
,全局执行,不要在第一次出现时停止。例如:
-e
此处不需要这些选项,除非您连接多个sed
命令:sed -e '...' -e '...'
等。您可以在反向引用和子表达式中找到更多信息。
使用 Raku(以前称为 Perl_6)
样本输入:
样本输出:
您提供的代码可以用多种语言编写(不仅如此
sed
),其中任何一种都可能引起您的共鸣。例如,上面的代码已经用 Perl 语言家族的成员 Raku 重新编写。大多数 Raku 代码应该是相当不言自明的:
lines
被读入,并且grep
-ped 因为!
没有^
行首>
“大于”角度,并且join
-ed。连接的行是comb
-ed (分成单个字符),Bag
-ged (每个字符都变成 akey
并且出现次数被计算/记录为values
),sort
-ed inreverse
以首先放置最高的出现次数,然后用 打印say
。https://raku.org