2012-10-29 3 views
2

필요 세 번째 줄과 관련있다. 마찬가지로, 4 번째 줄은 5 번째 줄과 연관되어 있습니다. 숫자 인 경우awk 스크립트 내가 여기에 연결 한 것처럼 데이터 집합을 수정 또는 가능 그렙 솔루션 (AWK 새로운)

71 
72 
88 
98 
99 
.... and so on... 

:

는 현재 우리가 임계 값 이상 (-1 아래의 1 이상 아무것도) 있던 모든 행 번호에 대한 정보를 출력하는 awk 스크립트를 가지고, 이것은 출력 (즉, 72이면 72 줄을 새로 작성한 다음 73을 출력하십시오.)

숫자가 홀수 인 경우 이전에 출력해야합니다 (즉, 99가 출력 된 경우 98 새 줄 99).

70 
71 
72 
73 
88 
89 

등등 ...

다시, 아이디어는 우리가 소음을 찾는 것입니다

이 데이터 세트 따라서 우리는 유효 연구를 위해 그것을 제거 할 필요가있다. 제공 할 수있는 도움에 감사드립니다.

편집 :

"awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) print (NR%2==0) ? NR ORS NR + 1 : NR - 1 ORS NR; next }' file.txt 

먼저 우리가 기본 알고리즘을 정교하게됩니다 : 아래에 제공되는 솔루션에서 나는 내 자신의 개인적인 학습뿐만 아니라이 글을 읽을 수 있습니다 다른 사람을 위해 그것을 파괴하기로 결정했습니다

if (cur == even) 
    print cur + \n + prev 
else if (cur == odd) 
    print prev + \n + cur 

-F'[ ,]' # a flag for field seperator and designating it with [ ,] 

'NR>2  # The total Number of input Records seen so far. 

{for (i=2;i<=NF;i++) # for loop starting at 2, ending when greater or equal to NR 

if ($i<-1 || $i>1) # when these conditions are met then 

print (NR%2==0) # print NR modulus 2 

? 

NR ORS NR + 1  # current OR next 

: NR - 1 ORS NR; # comparisons? 

next }'   # now go to the next NR 

file.txt   # save to file.txt 
+1

이 아래로 샘플 데이터의 4-8 라인, 필요한 출력하여 질문을 수정하시기 바랍니다. 또한, Stackoverflow는 사람들을 위해 일하는 것이 아니라 프로그래머를 돕는 것에 관한 것이므로, 지금까지 사용해 온 코드, 얻고있는 오류 메시지 및 현재 출력을 잘못 표시하기 위해 마크 업하십시오. 입력 상자의 맨 위에있는 {} 서식 지정 도구를 사용하여 데이터와 코드의 형식을 지정하여 읽을 수 있습니다. 모든 데이터와 코드를 선택하고 {} 아이콘을 클릭하십시오. 행운을 빕니다. – shellter

+1

C 쉘 스크립트 인 경우 조개 대신 실제 쉘을 사용하도록 수정해야합니다. –

+0

"awk C 셸 스크립트"란 무엇입니까? awk와 c-shell은 두 개의 서로 다른 스크립팅 언어입니다 (후자는 주로 대화 형 쉘입니다). –

답변

3

여기 GNU awk를 사용하여 하나의 방법 그리고 당신의 일부는 앞의 코드 위치 :

awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i<-1 || $i>1) print (NR%2==0) ? NR ORS NR + 1 : NR - 1 ORS NR; next }' file.txt 
+1

+1 연산자를 사용하기 위해 +1, 매우 부드럽게! – tlehman

+1

중복 된 행 번호가 문제가된다면 (아마도 그렇지는 않지만 질문에 명확하지 않다.) 간단히 명령을'sort -nu'로 파이프하면됩니다. HTH. – Steve

+0

ORS가 무엇인지 물어볼 수 있습니까? 그게 아니면? – jasonleonhard

2

원본 코드를 this question에서 가져 와서 NR의 패리티를 테스트하는 조건부에 넣습니다. (패리티는 짝수 또는 홀수의 속성이며, 모듈러스 연산자 : %를 사용하여 테스트됩니다.

awk -F'[ ,]' 'NR>2{for (i=2;i<=NF;i++) if ($i>=-1 || $i<=1) { if(NR%2 == 0) { print NR+1 } else { print NR-1} ; next } }'