공백이 있는 awk .txt 파일에서 .csv를 읽는 스크립트를 어떻게 작성합니까?

공백이 있는 awk .txt 파일에서 .csv를 읽는 스크립트를 어떻게 작성합니까?

아래 표(testtam.txt)에서 코드를 추출했습니다.

gene1   1   3   5   9           
gene2   0   0   4   4           
gene3   1   0   1   2           
gene4   5   5   0   10          
gene5   2   0   0   2   

필드 2, 3 또는 4 중 하나의 값이 0이 아닌 행만 별도의 파일(일치 파일)에 저장합니다.

awk '{
    if (    ($2 == $5 && $3 == 0 && $4 == 0) || \
        ($2 == 0 && $3 == $5 && $4 == 0) || \
        ($2 == 0 && $3 == 0 && $4 == $5) ) {
        print $0 > "match-file"
}   else if ($2 + $3 + $4 == $5) {
        print $0 > "nomatch-file"
     }    
}' testtam.txt

문제는 예를 들어 그런 종류의 .csv테이블이 있는 경우 .csv 파일에서는 작동하지 않는다는 것입니다.

gene1,1,3,5,9           
gene2,0,0,4,4           
gene3,1,0,1,2           
gene4,5,5,0,10          
gene5,2,0,0,2

awk는 이를 열로 인식합니다.

.csv의 열을 읽으려면 코드를 어떻게 얻나요?

답변1

다른 필드 구분 기호를 사용해야 합니다. awk -F옵션의 기능은 다음과 같습니다.

awk -F',' '{
    if (    ($2 == $5 && $3 == 0 && $4 == 0) || \
        ($2 == 0 && $3 == $5 && $4 == 0) || \
        ($2 == 0 && $3 == 0 && $4 == $5) ) {
        print $0 > "match-file"
}   else if ($2 + $3 + $4 == $5) {
        print $0 > "nomatch-file"
     }    
}' 

또는 두 번째 필드부터 마지막 ​​필드까지 두 개 이상의 필드 값이 0이 아닌 행을 일치시키려면 다음을 수행할 수 있습니다.

awk -F, '{ 
            c=0; 
            for(i=2;i<=NF-1;i++){ 
                c+= $i!=0
            } 
            print > ((c > 1) ? 
                "match-file" : 
                "nomatch-file")
          }' file

관련 정보