다음과 같은 파일이 있습니다.
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.800
237.8
0.000
0
또는 위의 가정 하에서 sub
질문에 표시된 기관 기반 접근 방식을 확장하되 다음이 필요합니다.정확히첫 번째 필드의 9개(빈 파이프로 구분된 요소일 수 있음) - AWK 스크립트는 다음과 같을 수 있습니다(다른 조건은 동일함).
NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1
gsub
Substitute는 두 개의 일치하는 하위 문자열, 즉 처음 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