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\.

답변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


-esed여러 명령을 연결하지 않는 한 여기에서는 이러한 옵션이 필요하지 않습니다 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은 가장 높은 발생 항목을 먼저 넣은 다음 로 인쇄합니다 .^>joincombBagkeyvaluessortreversesay

https://raku.org

관련 정보