나는 파일의 줄을 반대로 읽는 쉘 스크립트를 작성하고 있습니다. 후자에서 이전 행을 빼는 것이 필요하지만 후자가 더 큰 경우에만 가능합니다. 더 작다면 해당 행의 숫자만 원합니다.
예:
문서 내용:
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 }'
어떤 이유로 tac
awk를 사용할 수 없거나 독점적으로 사용하려는 경우 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{}
블록에서 파일의 첫 번째 줄을 인쇄하고, 필요하지 않으면 블록을 제거하세요.