sed コマンドの説明

sed コマンドの説明

私は次のような興味深いコマンドを見つけました。

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入力ストリームの各文字に対応する配列の値を増やしてこれを行います。入力が終わると、数と文字数の要約を出力します。

おすすめ記事