2014-09-15 4 views
0

저는 오랫동안 가지고있는 일부 CSV 파일을 필터링하려고했습니다. 내 스크립트가 왜 작동하지 않는지 알 수 없기 때문에 거의 직접 해보았습니다. 너희들이 내가 뭘 잘못하고 있는지 알아낼 수 있기를 바란다.1보다 작은 필드를 바꾼 다음 1보다 큰 값으로 행을 필터링하십시오.

나는 다음과 같은 파일이 : csv file

나는 다음과 같은 나오지도 스크립트를 사용하여 1보다 작은 값을 대체 할 수 있어요

: 다음 단계에서

sed -e 's/[0][0-9]*\.[0-9]*/0/g' genes.csv > genes-filtered1.csv 

을 내가 모두 제거 할 것인지를 모두 0 인 행 그러나 적어도 하나의 열에 1보다 큰 값이 있으면 계속 유지하려고합니다. 여러 스크립트를 시도했지만 작동하지 않습니다.

여기에 그들 중 일부입니다 :

awk '{ if ($2 > 1 || $3 > 1 || $4 > 1 || $5 > 1 || $6 > 1 || $7 > 1 || $8 > 1 || $9 > 1 || $10 > 1 || $11 > 1 || $12 > 1 || $13 > 1) print $0 }' genes-filtered1.csv > genes-filtered2.csv 

또는 하나의 열을 사용하여 임계 값을 기준으로 필터링하려고 : 나는 또한 시도

threshold=1 
awk -v threshold=$threshold '$3 > threshold' genes-filtered1.csv > genes-filtered2.csv 

:

awk '{ for (i=2; i<=NF; i++) { if ($i != 0) { print; next } } }' genes-filtered1.csv > genes-filtered2.csv 

마지막으로 나는 시도했다 :

awk '{for (i=2;i<=NF;i++) if ($i>=1){print $0;next}}' genes-filtered1.csv > genes-filtered2.csv 

출력 파일이 비어 있거나 원본 파일과 동일하지 않은 것이 문제입니다. 어떤 제안이든 그것을 고칠 수있는 방법을 고맙게 생각합니다. 또한 sed 명령으로 awk 명령을 수행 한 다음 모두 0으로 줄을 제거 할 수 있습니까? 감사합니다.

답변

2
awk ' 
BEGIN{ FS=OFS="," } 
NR > 1 { 
    allZeros = 1 
    for (i=2; i<=NF; i++) { 
     if ($i < 1) { 
      $i = 0 
     } 
     else { 
      allZeros = 0 
     } 
    } 
} 
!allZeros 
' file 
+1

고맙습니다. 처음에는 작동하지 않았습니다. 그러나 문제는 내 파일 내에있었습니다. @jaypal이 아래에서 말한 것을 한 후에 (dos2unix 사용) 작동한다. 고맙습니다. – degopwn

+1

@degopwn이 솔루션을 사용하고 받아 들여야합니다. 나는 테스트를하지 않았지만 일단 성능 향상을 한 번 줄을 반복하기 때문에 더 효율적이라고 확신합니다. –

2

awk을 사용할 때 실제로는 sed을 사용할 필요가 없습니다. 다음 솔루션은 하나의 필드가 1보다 큰 경우 플래그 f을 활성화합니다. 플래그가 true의 경우 우리는 다시 필드를 반복하고 10보다는 모든 값을 덜 변환 :

awk ' 
BEGIN { FS = OFS = "," }   # Set input and output field separator to , 
{ 
    for (i=2; i<=NF; i++) 
     if ($i >= 1) { f = 1 } # Enable a flag when any one field is greater than 1 
} 
f { 
    for (i=2; i<=NF; i++) { 
     $i = ($i < 1 ? 0 : $i) # If the flag is true convert values < 1 to 0 
    } 
    f = 0;      # Set the flag to false 
    print      # Print the line 
}' file 
+0

안녕하세요 감사합니다. 먼저 1보다 작은 값을 0으로 변환해야합니다 (이는 표현 된 것으로 간주되는 유전자의 임계 값입니다). 그런 다음 모든 샘플 (열)을 검사하여 유전자가 적어도 하나의 표본에서 발현되는지 확인해야합니다. 그런 다음 격자를 사용하여 트 렐리 스 그래프를 그립니다. 어떻게 든 귀하의 제안과 함께 작동하지만 파일의 형식을 변경합니다. 처음 두 행을 인쇄 한 다음 다른 모든 행을 앞에 놓습니다. 베스트. – degopwn

+0

@degopwn 파일에 제어 문자가있는 것 같습니다. 'cat -vet filename'을 통해 파일을 실행하고'^ M' 문자를 찾을 수 있습니까? 그렇다면 아마도 윈도우 라인 엔딩을 유닉스 라인 엔딩으로 변환하기 위해 파일에서'dos2unix'를 할 필요가 있습니다 –

+0

예, 많은 것을 가지고 있습니다. 이제는 효과가 있습니다. 고마워. – degopwn

관련 문제