sed를 사용하여 헤더의 여러 항목 변경

sed를 사용하여 헤더의 여러 항목 변경

다음 데이터 세트가 있습니다.

CHROM   POS     N_ALLELES       N_CHR   {ALLELE:FREQ}
6       85401233        2       46      T:1     A:0
6       85401234        2       46      C:1     G:0
6       85401235        2       46      T:1     G:0

5열의 헤더를 변경한 후 2열로 나누고 싶습니다.

REF     ALT
T:1     A:0
C:1     G:0
T:1     G:0

sed를 사용하여 ':'을 탭 구분 기호로 변환할 수 있습니다. 효과가있다

sed '1s/\:/\t/g' filename 

하지만 이 명령은 내가 원하는 대로 작동하지 않습니다.

sed '1s/\{ALLELE:/ALT\t/g' filename

다음 메시지를 제공합니다.

sed: -e expression #1, char 20: Invalid preceding regular expression

그리고

sed '1s/\:/\t/g' | '1s/\{ALLELE/REF /g' filename

-bash: 1s/\{ALLELE/REF /g: No such file or directory

답변1

파일의 내용을 수정하려면 ed표준 편집기가 필요합니다.

$ cat filename
CHROM   POS     N_ALLELES       N_CHR   {ALLELE:FREQ}
6       85401233        2       46      T:1     A:0
6       85401234        2       46      C:1     G:0
6       85401235        2       46      T:1     G:0
$ printf '%b\n' '1s/{ALLELE:FREQ}/REF\011ALT/' 'w' 'q'|ed -s filename
$ cat filename
CHROM   POS     N_ALLELES       N_CHR   REF     ALT
6       85401233        2       46      T:1     A:0
6       85401234        2       46      C:1     G:0
6       85401235        2       46      T:1     G:0
  • '1s/{ALLELE:FREQ}/REF\011ALT/'1행으로 이동하여 대체합니다. \011tab 으로 변환된 탭 문자의 8진수 표현입니다 printf.

  • 'w' 'q'파일에 대한 변경 사항을 저장하고 편집기를 종료합니다.


sed '1s/\{ALLELE:/ALT\t/g' filename

\{기본 정규 표현식이 특별하기 때문에 실패합니다 . 당신이 의미하는 바는 간단합니다 {.

그리고 여기

sed '1s/\:/\t/g' | '1s/\{ALLELE/REF /g' filename

첫 번째 sed에 입력 파일을 제공하지 않았으므로 실패했습니다. 정확하고 직접적인 sed 명령은 다음과 같습니다.

sed '1s/{ALLELE:FREQ}/REF\tALT/' filename

해당 플래그도 필요 g하지 않습니다. 줄에 교체해야 하는 일치 항목이 하나만 있습니다.

관련 정보