私は次のような興味深いコマンドを見つけました。
grep -v '^>' test.fasta | tr -d '\n' | sed -e 's/\(.\)/\1\n/g' | sort | uniq -c | sort -rn
私はそれが何を意味するかについてのアイデアを持っています(テキストファイルの文字数を数えます)。しかし、私の質問は次のとおりです。
sed -e 's/\(.\)/\1\n/g'
私はそれが3つの代替コマンドで構成されていることを知っています。 1つは改行文字(\n
)を置き換えることです。つまり、\(.\)
改行文字()を除くすべての文字と一致しますが、失われました/\1\
。
答え1
注文する
sed -e 's/\(.\)/\1\n/g'
sed
各文字をそれ自体に置き換え、その後に改行文字が続くGNU代替コマンドです。その結果、入力は単一文字の単一列に縮小されます。
$ echo hello | sed -e 's/\(.\)/\1\n/g'
h
e
l
l
o
これは\(.\)
個々のキャラクターをキャプチャする「キャプチャグループ」です。これは\1
最初のキャプチャグループの「逆参照」です。\1
代替テキストに使用すると、最初の角かっこにキャプチャされたコンテンツがすべて挿入されます。
また、バックスラッシュをあまり使用せずに書くこともできます。
sed 's/./&\n/g'
これは&
「表現が一致するすべて」を意味します。
このsed
コマンドにはGNUがsed
標準で必要であり、このような改行を挿入するsed
ことはできません。\n
標準ツールを使用してこれをより効率的に実行するには、次のようにします。
fold -w 1
代わりに。入力のすべての文字に正規表現のマッチングが必要ないため、これはより効率的です。
fold
パイプラインは以下を使用して作成できます。
grep -v '^>' file | tr -d '\n' | fold -w 1 | sort | uniq -c | sort -rn
または、awk
いくつかの手順を使用してパイプラインを削除します。
awk '!/^>/ { for (i = 1; i <= length; ++i) count[substr($0,i,1)]++ }
END { for (ch in count) print count[ch], ch }' file |
sort -rn
このawk
コードは、各文字の発生回数を計算します。count
入力ストリームの各文字に対応する配列の値を増やしてこれを行います。入力が終わると、数と文字数の要約を出力します。
答え2
これが状況をより明確にすることを願っています。
「3つの代替コマンドで構成されていることがわかっています。」
これは単なる代替コマンドです(参照する場合sed
):s/<pattern to search>/<replacement>/
次のコマンドを実行します。
- 各行を検索して
<pattern>
に置き換えます<replacement>
。 - 旗は
g
意味する太陽Gグローバル、基本的sed
に<pattern>
。
「しかし私は道を失った
/\1\
」
\(<pattern>\)
エスケープされた括弧を使用するか、オプションの引用のみを使用してパターンをキャプチャできます-E
。(<pattern>)
この<replacement>
セクションでキャプチャされたパターンはバックスラッシュと数字で参照されます\<number>
。複数を持つことができるため、数字はキャプチャ位置を表します。
sed -E '/(<first capture>)(<second capture>)/\1\2/'
したがって、コマンドは次のことをsed -e 's/\(.\)/\1\n/g'
意味します。
- 各文字をキャプチャし、
\(.\)
その文字と新しい行に置き換えます\1\n
。 - を使用して
g
、グローバルに実行し、最初の発生時に停止しないでください。
例えば:
$ echo foo | sed -E 's/(.)/\1\n/g'
f
o
o
-e
sed
複数のコマンドを接続しない限り、ここではこれらのオプションは必要ありませんsed -e '...' -e '...'
。
詳細は以下で確認できます。逆参照とサブ式。
答え3
Raku(以前のPerl_6)の使用
raku -e 'for lines.grep({ !/ ^ \> / }).join { .say for .comb.Bag.sort(*.values).reverse};'
入力例:
>sp|P01308|INS_HUMAN Insulin OS=Homo sapiens OX=9606 GN=INS PE=1 SV=1
MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAED
LQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN
出力例:
L => 20
G => 12
A => 10
E => 8
Q => 7
P => 6
C => 6
V => 6
R => 5
S => 5
Y => 4
F => 3
T => 3
N => 3
M => 2
D => 2
K => 2
I => 2
W => 2
H => 2
あなたが提供するコードはsed
(単に)さまざまな言語で書くことができ、それらのどれもあなたに共感することができます。たとえば、上記のコードはPerl言語ファミリーに属するRakuで書き直されました。
ほとんどのRakuコードは説明が非常に明確でなければなりません。lines
を読むと、grep
-pedは行の先頭に「より大きい」角度が!
ないことを意味し、-edは意味します。連結行は-ed(別々の文字に分割)、-ged(各文字発生がaになり、発生回数が計算/記録される)、-ed inは最も高い発生項目を先に入れてから印刷します。^
>
join
comb
Bag
key
values
sort
reverse
say