이전 행보다 큰 경우에만 역방향으로 행을 빼는 방법

이전 행보다 큰 경우에만 역방향으로 행을 빼는 방법

나는 파일의 줄을 반대로 읽는 쉘 스크립트를 작성하고 있습니다. 후자에서 이전 행을 빼는 것이 필요하지만 후자가 더 큰 경우에만 가능합니다. 더 작다면 해당 행의 숫자만 원합니다.

예:

문서 내용:

100
200
300
100
300

결과는 다음과 같습니다.

200     # line 5 - line 4    
100     # line 4 (as it's < line 3) 
100
100

값이 >=인지 여부에 관계없이 이전 행을 빼는 데 사용하는 코드는 다음과 같습니다.

awk 'p{print $0-p}{p=$0}' inputfile > outputfile

여전히 이 작업을 수행해야 하지만 값이 이전 행보다 큰 경우에만 가능합니다.

나는 while read 루프를 사용할 생각이지만, 비교할 각 행에 변수를 할당하는 등의 작업은 정말 두뇌 집약적입니다. 미리 감사드립니다!

답변1

tac파일의 줄 순서를 바꾸는 데 유용합니다 - (BSD tail -r도 줄 순서를 바꿀 수 있습니다)

tac file | awk 'p { if( p>$1 ) print p-$1; else print p } { p=$1 }' 

어떤 이유로 tacawk를 사용할 수 없거나 독점적으로 사용하려는 경우 awk배열을 통해 전체 파일을 메모리로 읽어온 후 END{}배열을 역순으로 처리할 수 있습니다.

awk '{ r[i++]=$0};  END{ for(i=i-1; i>=0; i--) 
       if( r[i+1] ) if( r[i+1]>r[i] ) print r[i+1]-r[i]; else print r[i+1] 
     }' file

답변2

tac파일을 반전시킨 다음 awk계산을 수행 할 수 있습니다 . 나는 file선을 더 무작위로 만들기 위해 당신의 것을 수정했습니다.

$ cat file
101
220
303
140
305
$ tac file | awk '{if(last>$0)print last-$0;else print last;last=$0}END{print last}'

165
140
83
119
101

두 가지 참고사항:

  • 결국, 필요하지 않은 경우 첫 번째 줄(빈 줄)을 삭제해야 합니다.
  • END{}블록에서 파일의 첫 번째 줄을 인쇄하고, 필요하지 않으면 블록을 제거하세요.

관련 정보