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'
我知道它由三個替代命令組成。一種是替換換行符(
\n
),一個匹配除換行符(\(.\)
)之外的任何字元,但我迷路了/\1\
?
命令
sed -e 's/\(.\)/\1\n/g'
是一個單一的 GNU
sed
替換命令,用它自己替換每個字元,後跟一個換行符。這樣做的效果是將輸入折疊成單個字元的單列。$ echo hello | sed -e 's/\(.\)/\1\n/g' h e l l o
這
\(.\)
是一個“擷取組”,擷取單個字元。這\1
是對第一個擷取組的“反向引用”。在替換文本中使用\1
將插入第一個括號擷取的任何內容。它也可以寫成沒有那麼多反斜杠
sed 's/./&\n/g'
其中
&
僅表示“表達式匹配的任何內容”。該
sed
命令要求 GNUsed
作為標準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
輸入流中每個字元對應的數組中的值來實現這一點。在輸入結束時,輸出計數和計數的字元的摘要。