나는 다음과 같은 레이아웃(열/변수)을 가진 매우 큰(80GB) 파일 세트(게놈 변형 용량)를 가지고 있습니다. 현재 ".txt.gz"입니다.
Chr RSID POS REF ALT Ind1 Ind2...Ind(n) 여기서 1:n은 개별입니다.
이 파일을 다음과 같이 편집하고 싶습니다.
Chr 열/변수는 모든 행(예: 3)에 대해 특정 염색체 번호로 설정됩니다.
새 열이 파일의 특정 위치에 삽입됩니다. 새 열/변수를 ALT와 Ind1 사이에 삽입하여 새 열이 편집된 파일의 6번째 열이 되도록 하고 싶습니다. 또한 이 열의 값을 상수(예: 0)로 설정하고 싶습니다.
마지막으로 편집된 파일을 읽은 것과 동일한 형식으로 출력하고 싶습니다. 따라서 출력은 ".txt.gz"여야 합니다.
도움을 주시면 감사드리며 자세한 내용을 알려드리겠습니다.
답변1
파일의 압축을 풀고 압축되지 않은 데이터 스트림을 전달하고 수정 awk
되도록 한 awk
다음 압축을 위해 스트림을 전달합니다 gzip
.
gzip -c -d <file.txt.gz |
awk -F '\t' 'BEGIN { OFS = FS } { $1 = 3; $6 = 0 OFS $6 }; 1' |
gzip -c >newfile.txt.gz
이 awk
명령은 입력 필드 구분 기호( FS
)와 출력 필드 구분 기호( OFS
)를 탭 문자로 설정합니다. 그런 다음 첫 번째 필드를 로 설정 3
하고 6번째 필드를 로 설정 0
한 다음 탭과 이전 6번째 필드를 설정합니다.
1
스크립트의 마지막 별도 섹션에서는 awk
수정된 데이터가 출력됩니다.
입력은 awk
압축 해제된 데이터 스트림 gzip -d
이고 출력은 압축 awk
됩니다 gzip
.
데이터에 헤더 행이 있는 경우 별도로 수정해야 합니다.
gzip -c -d <file.txt.gz |
awk -F '\t' 'BEGIN { OFS = FS }
NR == 1 { $6 = "NEW" OFS $6 }
NR != 1 { $1 = 3; $6 = 0 OFS $6 }; 1' |
gzip -c >newfile.txt.gz
여기서는 입력 줄 번호에 따라 다양한 작업을 수행합니다. 행 1에 있는 경우 헤더를 NEW
새로운 6번째 필드의 헤더로 삽입합니다. 행 1이 아닌 경우 이전과 같이 데이터를 수정합니다.
로 이 작업을 수행할 수도 있지만 sed
질문에 로 표시할 때 awk
사용하기를 선호하는 도구라고 가정합니다 .
답변2
gawk, mawk-1, mawk-2 및 nawk와 함께 작동하는 것으로 확인되었습니다.
(…gunzip…)\
\
| mawk 'BEGIN { _+=___=_+=(__=_^=OFS=FS="\t")+_ }\
$_=(__==NR?"NEW":_<($__=___))FS $_'\
| (…re-gzip…)