awk 파일 작업

awk 파일 작업

여러 파이프된 명령의 출력인 파일이 있습니다. 이 같은

command1 input.txt| command2 | command3 | input file

파일이 탭으로 구분되어 있습니다.

명령 3 이후 내 입력 파일은 다음과 같습니다.

chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866 gene_id "ENSG00000196911.10"; transcript_id "ENST00000368564.6"; gene_type "protein_coding"; gene_name "KPNA5"; transcript_type "protein_coding"; transcript_name "KPNA5-202"; level 2; protein_id "ENSP00000357552.1"; transcript_support_level "1"; tag "basic"; tag "appris_principal_1"; tag "CCDS"; ccdsid "CCDS5111.1"; havana_gene "OTTHUMG00000015448.4"; havana_transcript "OTTHUMT00000041967.2";
chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866 gene_id "ENSG00000196911.10"; transcript_id "ENST00000356348.6"; gene_type "protein_coding"; gene_name "KPNA5"; transcript_type "protein_coding"; transcript_name "KPNA5-201"; level 2; protein_id "ENSP00000348704.1"; transcript_support_level "1"; tag "basic"; tag "appris_principal_1"; tag "CCDS"; ccdsid "CCDS5111.1"; havana_gene "OTTHUMG00000015448.4"; havana_transcript "OTTHUMT00000041969.2";

; 명령 3 후에 awk 명령을 사용하여 다음 명령을 사용하여 마지막 열을 분할했습니다.

command1 input.txt| command2 | command3 | awk -F "\t" -v OFS="\t" '{split($NF,a,";"); $NF=""; print $0,a[1],a[4]}'

command3에서 가져온 파일의 마지막 필드를 분할한 다음 마지막 필드를 제외한 모든 필드를 인쇄하고 분할 필드 a[1] 및 a[4]를 인쇄하고 싶지만 이는 열 1-25 사이에 있습니다. 탭 1 추가 [1], 하나 [4]. 이것을 어떻게 피할 수 있습니까?

감사해요

이것이 출력이다

chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866     gene_id "ENSG00000196911.10"     gene_name "KPNA5"
chr6    116732135   116741866   116732135   116732368   116741505   116741866   +   0.79    0.51    0.97    0.77    0.48    0.97    0.02    0.37    'chr6:116732136-116732368:+@chr6:116741506-116741866:+.A.withRI','chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.up_chr6:116732136-116732368:+@chr6:116741506-116741866:+.B.dn'    (0,0):10,(1,0):147,(1,1):1  0:148   (0,0):36,(1,0):161,(1,1):3  0:163,1:1   chr6    +   116732136,116732136 116741866,116741866     gene_id "ENSG00000196911.10"     gene_name "KPNA5"

답변1

그래서 주어진

$ printf 'foo\tbar\ta;b;c;d' | 
    awk -F "\t" -v OFS="\t" '{split($NF,a,";"); $NF=""; print $0,a[1],a[4]}' | cat -A
foo^Ibar^I^Ia^Id$

(저는 시각화를 쉽게 cat -A하기 위해 탭을 표시 했습니다 ^I.) 이중 탭을 없애고 싶나요?

그렇다면 한 가지 접근 방식은 NF빈 문자열을 다음에 할당하는 대신 감소시키는 것입니다 $NF.

$ printf 'foo\tbar\ta;b;c;d' | 
    awk -F "\t" -v OFS="\t" '{split($NF,a,";"); NF--; print $0,a[1],a[4]}' | cat -A
foo^Ibar^Ia^Id$

또 다른 방법은 문자열을 필드로 인쇄하는 대신 문자열을 연결하는 것입니다. ,문자열 사이의 내용을 제거하면 됩니다.

$ printf 'foo\tbar\ta;b;c;d' | 
    awk -F "\t" -v OFS="\t" '{split($NF,a,";"); $NF=""; print $0 a[1],a[4]}' | cat -A
foo^Ibar^Ia^Id$

관련 정보