파일 구분 기호가 awk 코드에서 작동하지 않습니다

파일 구분 기호가 awk 코드에서 작동하지 않습니다

다음과 같은 파일이 있습니다.

Name    Length  EffectiveLength TPM NumReads
ENST00000456328.2|ENSG00000223972.5|OTTHUMG00000000961.2|OTTHUMT00000362751.1|DDX11L1-202|DDX11L1|1657|lncRNA|  1657    1493.961    0.112690    3.673
ENST00000450305.2|ENSG00000223972.5|OTTHUMG00000000961.2|OTTHUMT00000002844.2|DDX11L1-201|DDX11L1|632|transcribed_unprocessed_pseudogene|   632 468.996 0.000000    0.000
ENST00000488147.1|ENSG00000227232.5|OTTHUMG00000000958.1|OTTHUMT00000002839.1|WASH7P-201|WASH7P|1351|unprocessed_pseudogene|    1351    1187.961    9.176212    237.800
ENST00000619216.1|ENSG00000278267.1|-|-|MIR6859-1-201|MIR6859-1|68|miRNA|   68  69.000  0.000000    0.000
ENST00000473358.1|ENSG00000243485.5|OTTHUMG00000000959.2|OTTHUMT00000002840.1|MIR1302-2HG-202|MIR1302-2HG|712|lncRNA|   712 548.982 0.000000    0.000
ENST00000469289.1|ENSG00000243485.5|OTTHUMG00000000959.2|OTTHUMT00000002841.2|MIR1302-2HG-201|MIR1302-2HG|535|lncRNA|   535 372.012 0.000000    0.000

나는 출력을 다음과 같이 원한다:

여기에 이미지 설명을 입력하세요.

AWK를 사용하여 시도했습니다.

awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }'

첫 번째 ID ENST를 인쇄합니다. 하지만 내가 그것을 다음과 같이 바꾸면:

awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $5); print }'

아무것도 하지 않습니다.

그래서 나는 노력했다

awk -F\| '{print $5"\t"$7"\t"$9}'

작동하지만 길이 열이 두 번 생성되고 출력 파일에서 헤더가 손실됩니다.

누구든지 도와줄 수 있나요?

답변1

분리 <TAB>된 파일의 첫 번째 열에 항상 9개의 요소가 있고(실제로는 "5개 이상의 요소"이면 충분함) |파이프( )로 구분되어 있으며(제공한 예제의 9번째 요소는 항상 비어 있음) 의도가 다음과 같다고 가정합니다. 다섯 번째 요소만 선택하려면 AWK의 편의 split기능을 사용할 수 있습니다.

awk -v FS='\t' -v OFS='\t' \
  'NR > 1 { split($1, t, /\|/); $1 = t[5]; } 1' input_file |
  column -t -R 2,3,4,5

column~에서유틸리티Linux그런 다음 패키지를 사용하여 출력 형식을 테이블( -t)로 지정하고 -R옵션에 오른쪽 정렬 열 목록을 쉼표로 구분된 목록으로 제공합니다.

원하는 경우 질문에 표시된 출력과 더 밀접하게 일치하도록 해당 필드를 숫자로 강제로 변환할 수 있습니다. 예를 들어, → 및 → 을 $5 = $5 + 0얻습니다 .237.800237.80.0000

또는 위의 가정 하에서 sub질문에 표시된 기관 기반 접근 방식을 확장하되 다음이 필요합니다.정확히첫 번째 필드의 9개(빈 파이프로 구분된 요소일 수 있음) - AWK 스크립트는 다음과 같을 수 있습니다(다른 조건은 동일함).

NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1

gsubSubstitute는 두 개의 일치하는 하위 문자열, 즉 처음 4개의 구분 요소( 앵커 참고)와 마지막 4개 요소( 앵커 참고)를 sub제거하려고 하기 때문에 사용됩니다 .|^$

답변2

세상은 당신의 굴이다..

awk분할 하면 |모든 데이터가 마지막 필드에 있고 Name데이터가 그 안에 있으므로 $(NF-4)다음을 수행할 수 있습니다.

awk -F'|' 'NR==1{print }NR>1{print $(NF-4) $NF}' file | column -t -R 2,3,4,5

Name             Length  EffectiveLength       TPM  NumReads
DDX11L1-202        1657         1493.961  0.112690     3.673
DDX11L1-201         632          468.996  0.000000     0.000
WASH7P-201         1351         1187.961  9.176212   237.800
MIR6859-1-201        68           69.000  0.000000     0.000
MIR1302-2HG-202     712          548.982  0.000000     0.000
MIR1302-2HG-201     535          372.012  0.000000     0.000

split $NF그런 다음 계속해서 형식을 \t얻을 수 있습니다0

awk -F'|' '
   NR==1{print }
   NR>1{split($(NF),vs,"\\t"); print $(NF-4), vs[2]+0, vs[3]+0, vs[4]+0, vs[5]+0}' file | 
   column -t -R 2,3,4,5

Name             Length  EffectiveLength      TPM  NumReads
DDX11L1-202        1657          1493.96  0.11269     3.673
DDX11L1-201         632          468.996        0         0
WASH7P-201         1351          1187.96  9.17621     237.8
MIR6859-1-201        68               69        0         0
MIR1302-2HG-202     712          548.982        0         0
MIR1302-2HG-201     535          372.012        0         0

또는 g가 있으면 awk여러 구분 기호를 사용할 수도 있습니다 [|\t].

awk -F'[|\t]' '
   NR==1{print }
   NR>1{print $(NF-8), $(NF-3)+0, $(NF-2)+0, $(NF-1)+0, $NF+0}' file | 
   column -t -R 2,3,4,5

Name             Length  EffectiveLength      TPM  NumReads
DDX11L1-202        1657          1493.96  0.11269     3.673
DDX11L1-201         632          468.996        0         0
WASH7P-201         1351          1187.96  9.17621     237.8
MIR6859-1-201        68               69        0         0
MIR1302-2HG-202     712          548.982        0         0
MIR1302-2HG-201     535          372.012        0         0

아니면 awk완전히 무시하고

cut -d '|' --output-delimiter=" " -f 5,9 file | column -t -R 2,3,4,5

Name             Length  EffectiveLength       TPM  NumReads
DDX11L1-202        1657         1493.961  0.112690     3.673
DDX11L1-201         632          468.996  0.000000     0.000
WASH7P-201         1351         1187.961  9.176212   237.800
MIR6859-1-201        68           69.000  0.000000     0.000
MIR1302-2HG-202     712          548.982  0.000000     0.000
MIR1302-2HG-201     535          372.012  0.000000     0.000

관련 정보