특정 열의 값에 동일한 부호(- 또는 +)가 있는 두 파일의 행을 필터링하는 방법은 무엇입니까?

특정 열의 값에 동일한 부호(- 또는 +)가 있는 두 파일의 행을 필터링하는 방법은 무엇입니까?

아래와 같이 두 개의 파일이 있습니다.

  • file1:
    6:66893424_T_C -0.5985 
    rs151222586 -0.0351 
    rs12364336 -0.0030 
    rs57502521 0.0099 
    
  • file2:
    6:66893424_T_C 0.5985
    rs151222586 -0.0351
    rs12364336 0.003
    rs57502521 -0.0099
    

제 생각에는:

  • 2열에서 동일한 기호(빼기 기호 또는 더하기 기호)가 있는 행 찾기
  • 기호 일치를 위해 열 1 항목 목록을 만듭니다.
  • 일치하는 항목이 없는 열 1 항목의 목록을 만듭니다.

제 생각에는:

  • 일치하는 출력은
    rs151222586
    
  • 그리고 비교할 수 없는 출력
    6:66893424_T_C
    rs12364336
    rs57502521
    

답변1

두 번째 필드를 네 번째 필드와 비교할 수 있도록 +awk 파일을 나란히 붙여넣습니다.

paste file1 file2 |
awk '
  $2&&$4 {
    print $1 > ($2*$4>0?"match":"unmatch")
  }
'

결과는 파일의 일치 및 불일치입니다.

답변2

여러 입력 파일을 처리하는 것은 자질구레한 일이며 데이터를 단일 파일로 축소하면 더 쉬울 것입니다. 예 paste를 들어 join다음과 같이 할 수 있습니다.

$ paste file1 file2
6:66893424_T_C -0.5985  6:66893424_T_C 0.5985
rs151222586 -0.0351     rs151222586 -0.0351
rs12364336 -0.0030      rs12364336 0.003
rs57502521 0.0099       rs57502521 -0.0099

$ join -j1 file1 file2
6:66893424_T_C -0.5985  0.5985
rs151222586 -0.0351  -0.0351
rs12364336 -0.0030  0.003
rs57502521 0.0099  -0.0099

전자는 올바른 순서를 얻는 데 의존합니다. 두 경우 모두 파일이 서로 일치하지 않는지 확인해야 합니다.

paste다른 기호로 서명된 항목을 사용하여 출력 :

$ paste file1 file2 | awk '($2 >= 0) != ($4 >= 0) {print $1}'
6:66893424_T_C
rs12364336
rs57502521

>=계산 결과는 1또는 0이므로 !=비슷한 방법을 사용하여 비교 결과를 비교합니다. 나는 임의로 0을 양수로 정렬하기로 결정했습니다. ==등호 에도 비슷하게 사용됩니다 .

또한 기호 함수를 명시적으로 정의할 수도 있습니다.

$ paste file1 file2 | awk 'function sign(x) { return x >= 0 ? +1 : -1; }
                           sign($2) != sign($4) {print $1}'
6:66893424_T_C
rs12364336
rs57502521

답변3

두 파일에 대해 한 줄씩 작업을 수행할 수 없으므로 awk일정량의 버퍼링이 필요합니다. 파일이 충분히 작으면 작동합니다.

awk 'NR==FNR{v[$1]=$2; next}
     {if ($2*v[$1]>=0) {print $1 > "matched"} else {print $1 > "unmatched"}}' file1.txt file2.txt
  • 를 읽을 때 file1.txt"레이블"-"값" 쌍만 배열에 기록되고 v실행은 다음 입력 줄로 점프합니다. 각 파일 라인 카운터가 글로벌 라인 카운터와 동일한 지 확인하여 처리 중인지 file1.txt여부를 구분합니다 . 동일하면 첫 번째 파일을 처리하는 중입니다.file2.txtFNRNR
  • 을 읽을 때 file2.txt현재 행의 "값" 부분과 해당 값을 곱한 값이 file1.txt0인지 양수인지 확인합니다. 그렇다면 해당 부호는 동일하며 "레이블" 부분은 파일에 출력됩니다 matched. 음수인 경우 부호가 동일하지 않으며 "레이블" 부분이 파일에 출력됩니다 unmatched.

결과:

~ > cat matched 
rs151222586

~ > cat unmatched
6:66893424_T_C
rs12364336
rs57502521

노트

  • 나는 그것을 가정 +0하고 -0등호를 갖는 것으로 간주됩니다.
  • 또한 한 파일에서는 열 2가 0이고 다른 파일에서는 0이 아닌 행이 없다고 가정합니다.

관련 정보