나는 다음과 같은 흥미로운 명령을 발견했습니다.
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\
.
답변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