awk 파일 작업

awk 파일 작업

이 형식의 대용량 파일이 있는데 헤더를 포함하여 처음 몇 줄을 보여드리겠습니다.

gene    c1  c2  c3  c4  c5  c6  c7  c8
G1*1    0   0   0   0   0   0   0   0
G2*2    0   0   0   0   1   1   1   1
G3*3    0   0   2   2   44  44  62  62
G4*4    22  0   46  0   1308    7   1773    4

유전자의 첫 번째 행은 헤더 행입니다. 그대로 유지하고 나머지 줄을 FS = *로 분할하여 이제 이와 같은 파일을 출력으로 갖고 싶습니다.

gene    coord   c1  c2  c3  c4  c5  c6  c7  c8
G1  1   0   0   0   0   0   0   0   0
G2  2   0   0   0   0   1   1   1   1
G3  3   0   0   2   2   44  44  62  62
G4  4   22  0   46  0   1308    7   1773    4

따라서 헤더 행에 "coord"라는 추가 필드를 추가하여 후속 행을 분할할 때 모든 항목이 정렬되도록 하고 싶습니다.

awk를 사용하여 분할하는 방법을 알고 있지만 헤더 라인이 혼란스럽습니다.

awk -F '*' -v OFS="\t" '{print $1,$2}' ##This is for 2nd line and onwards

답변1

헤더 행은 특별한 경우이므로 그렇게 처리할 수 있습니다.

awk -F '*' -v OFS='\t' \
  'NR == 1 { sub(/^gene/, "&" OFS "coord"); print; next }
  { print $1, $2 }'

답변2

awk사용이 절대적인 요구사항 인가요 ? 이것은 직업처럼 보입니다 sed.

sed '1s/gene/&    coord/;2,$s/\*/  /'

이것은 자명하다:

  • 1s/gene/& coord/– 첫 번째 줄에서 "gene"을 "gene coord"로 변경합니다.
  • 2,$s/\*/ /– 파일 끝 두 번째 줄에서 "*" 텍스트를 공백으로 변경합니다.

답변3

또 다른 접근 방식은 다음과 같습니다.

awk -F '[ \t*]' -v OFS='\t' 'NR==1{$2="coord\t"$2;print;next}{$1=$1}1' file
  • 입력 파일이 명확하지 않아서 공백, 탭, 3개의 필드 구분 기호를 사용했습니다 *. 이제 더 잘 입력하면 목록에서 항목을 제거할 수 있습니다.

  • $1=$1기본적으로 필드 재구성(모든 곳에서 새 필드 구분 기호 사용) 외에는 아무것도 수행하지 않습니다.

  • Final은 1수정된 모든 내용을 인쇄하는 데에만 사용됩니다.

관련 정보