2017-12-11 15 views
2

에 몇 일반적으로 열이보다 행으로 이동합니다 :어떻게 특정 열에서 패턴을 포함하는 행을 내가 이런 큰 탭 파일이 UNIX

rs980 INPP5B missense  I  749  NP_001284363.1 
rs980 INPP5B reference  L  749  NP_001284363.1 
rs980 INPP5B missense  F  749  NP_001284363.1 
rs980 INPP5B missense  I  913  NP_005531.2 
rs980 INPP5B reference  L  913  NP_005531.2 
rs980 INPP5B missense  P  913  NP_005531.2 
rs1921 ISG15 reference  S  83  NP_005092.1 
rs1921 ISG15 missense  N  83  NP_005092.1 
rs1921 ISG15 missense  T  83  NP_005092.1 
rs2607 HEATR1 missense  K  2133 NP_060542.4 
rs2607 HEATR1 missense  Q  2133 NP_060542.4 
rs2607 HEATR1 reference  E  2133 NP_060542.4 

을 나는 모든 행을 싶습니다 'reference'패턴을 생성하고 참조 패턴이없는 행 바로 다음에있는 한 열을 이동 시키며 또한 첫 번째, 다섯 번째 및 여섯 번째 열에 일반적으로 문자열을 포함합니다. 그래서 출력은 다음과 같아야합니다 등등

rs980 INPP5B missense  I  749  NP_001284363.1  L 
rs980 INPP5B missense  F  749  NP_001284363.1  L 
rs980 INPP5B missense  I  913  NP_005531.2  L 
rs980 INPP5B missense  P  913  NP_005531.2  L 
rs1921 ISG15 missense  N  83  NP_005092.1  S 
rs1921 ISG15 missense  T  83  NP_005092.1  S 
rs2607 HEATR1 missense  K  2133 NP_060542.4  E 
rs2607 HEATR1 missense  Q  2133 NP_060542.4  E 

그리고를 ... 나는 다른 사람과 참조를 분할하지만 떠들썩한 파티에서 동일한 파일에 그것을 할 필요가 누구에 두 개의 파일을 통해 AWK와 배열에 그것을 가지고 . 더 간단한 방법으로이 작업을 수행 할 수 있습니까? 미리 감사드립니다.

예 @Inian. 나는 두 파일을 수행하여 참조와 다른 것들을 분리한다. 이런 식으로 나는 AWK에 의해 두 파일에 일반적으로해야보다 함께 열을 가입하는

awk 'BEGIN {FS=OFS="\t"} NR==FNR {h[$2] = $1; next} {print $1,$2,$3,$4,$5,$6,h[$4] file_1 file_2 > output_file 

같은 다음 명령 무언가를하고 난 의 다른 컬럼이 컬럼을 관련시키는 AWK에 의해 배열을 생성 출력 파일에서 인쇄하고 싶은 참조. ,

INPP5B reference  L  rs980;749;NP_001284363.1 

등 내가

awk 'BEGIN {FS=OFS="\t"} NR==FNR {h[$4] = $3; next} {print $1,$2,$3,$4,h[$4]}' file_others file_reference > output_file 

이 내가 그것을 얻을 방법에 대한 간단한 요약을 적용

INPP5B missense  I  rs980;749;NP_001284363.1 
INPP5B missense  F  rs980;913NP_005531.2 

및 참조 : 요약하면 하나 개의 파일은 같다 하지만 나는 같은 원본 파일에서해야한다. 사전

답변

4

"파일을"가정에 감사합니다 ("큰 탭 파일") 여기

awk -F '\t' -v OFS='\t' ' 
    {key = $1 FS $2 FS $5 FS $6} 
    NR == FNR { 
     if ($3 == "reference") val[key] = $4 
     next 
    } 
    $3 != "reference" {print $0, val[key]} 
' file file 

, 우리에 한 번 참고 문헌을 수집하고, 두 번 파일을 처리하는 참조를 포함하여 모든 라인을 포함 정보를 인쇄합니다.

출력 :

rs980 INPP5B missense  I  749  NP_001284363.1 L 
rs980 INPP5B missense  F  749  NP_001284363.1 L 
rs980 INPP5B missense  I  913  NP_005531.2  L 
rs980 INPP5B missense  P  913  NP_005531.2  L 
rs1921 ISG15 missense  N  83  NP_005092.1  S 
rs1921 ISG15 missense  T  83  NP_005092.1  S 
rs2607 HEATR1 missense  K  2133 NP_060542.4  E 
rs2607 HEATR1 missense  Q  2133 NP_060542.4  E 
+1

다양한 중복 필드의 일부를 필터링, 당신에게 에드 감사합니다. –

+0

잭맨에게 감사드립니다. 올바르게 작동합니다. 이해한다면 먼저 관심있는 열이있는 키를 생성 한 다음 $ 3이 참조와 같으면 키의 네 번째 열만 고려하십시오. 마지막으로 세 번째 열이 참조와 다른 경우 모든 열을 인쇄하고 키 열과 같으면 문자를 넣습니다. –

+1

중요한 비트는'NR == FNR' :'NR'은 지금까지 처리 된 총 레코드 수입니다. 'FNR'은 현재 파일 *에 대해 지금까지 처리 된 레코드의 수입니다. NR == 첫 번째 파일에 대해서만 FNR이 참일 수 있습니다. –

2

의 옵션을 먼저 각각 2, 3 열하여 파일을 정렬하는 것입니다, 그럼 당신은 단지 AWK를 통해 한 번에 처리가 필요합니다.나는 빨리 생각 될 것이라고 확실하지 않다 :

sort -k 2,2n -k 3,3n infile | awk 'BEGIN{OFS="\t"} $3=="missense"{output[i++]=$0} $3=="reference"{for(line in output){print output[line],$4;delete output[line]}}' 

출력 :

rs1921 ISG15 missense  N  83  NP_005092.1  S 
rs1921 ISG15 missense  T  83  NP_005092.1  S 
rs2607 HEATR1 missense  K  2133 NP_060542.4  E 
rs2607 HEATR1 missense  Q  2133 NP_060542.4  E 
rs980 INPP5B missense  F  749  NP_001284363.1 L 
rs980 INPP5B missense  I  749  NP_001284363.1 L 
rs980 INPP5B missense  I  913  NP_005531.2  L 
rs980 INPP5B missense  P  913  NP_005531.2  L 
+0

스마트하지만 원래의 주요 주문을 보존해야 할 수도 있습니다! – karakfa

+0

감사합니다. @JNevill. 그것은 올바르게 작동합니다. 첫 번째 옵션을 선호하기 때문에 매우 유용합니다. 다시 감사합니다 –

1

awk는이 두 번 파일을 처리합니다

$ awk ' 
BEGIN { FS=OFS="\t" }    # set separators 
$3=="reference" { a[$6]=$4 }  # get $4 from reference record (twice actually) 
NR==FNR { next }     
$3=="missense"{ print $0, a[$6] } # fetch $4 using $6 and print 
' file file 
rs980 INPP5B missense  I  749  NP_001284363.1 L 
rs980 INPP5B missense  F  749  NP_001284363.1 L 
rs980 INPP5B missense  I  913  NP_005531.2  L 
rs980 INPP5B missense  P  913  NP_005531.2  L 
rs1921 ISG15 missense  N  83  NP_005092.1  S 
rs1921 ISG15 missense  T  83  NP_005092.1  S 
rs2607 HEATR1 missense  K  2133 NP_060542.4  E 
rs2607 HEATR1 missense  Q  2133 NP_060542.4  E 
+0

'NR == FNR && $ 3 == "참조"를 사용하여 작동시킬 수 없었기 때문에 뇌졸중이 일어 났을 것이라고 확신했습니다 ... "친구에게 전화를 걸어서 그가 연설. : D –

+2

네, NR == FNR –

+2

인 * line마다'next'를 호출하기 때문에'NR == FNR && 기타 조건 '을주의해야합니다. 'NR == FNR {if ($ 3 == "reference") a [$ 6] = $ 4; 다음}'은 당신이 원하는 것입니다. –

1

두 단계 프로세스가

만들 합성 키와 원래 입력 순서가있는 정렬 된 파일

,
awk -v d='_' '{print $1 d $2 d $5 d $6 , NR , $0}' | sort > temp_file 

키에 가입하고

join temp_file temp_file -o1.2,1.3,1.4,1.5,1.6,1.7,1.8,2.5,2.6 | 
sort -n         | # sort back to original order 
awk '$4=="missense" && $8=="reference"' | # filter required records 
cut -d' ' -f1,8 --complement    # get rid of seq no. and extra field 
+0

고마워요 @karafka. 제대로 작동합니다! –