![연속된 숫자로 항목을 그룹화합니다.](https://linux55.com/image/155530/%EC%97%B0%EC%86%8D%EB%90%9C%20%EC%88%AB%EC%9E%90%EB%A1%9C%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EA%B7%B8%EB%A3%B9%ED%99%94%ED%95%A9%EB%8B%88%EB%8B%A4..png)
아래와 같은 일련의 파일이 있고 이를 "인접 그룹"으로 그룹화해야 합니다. 각 줄은 숫자로 시작하며 아래의 다음 줄이 숫자와 같거나 그보다 작으면 파일을 위에서 아래로 읽어야 합니다. 위 1. 그들은 함께 "그룹화"되어야 하며, 여러 행이 함께 있는 경우에도 마찬가지입니다.
최종 목표는 각 그룹에 가장 가까운 숫자가 1 이상 다른 파일의 각 "그룹"에서 숫자를 생성하는 것입니다. 아래 샘플 파일 아래에 필요한 출력을 표시했습니다.
78' Corner, Bristol City. Conceded by Wes Hoolahan.
75' Corner, Bristol City. Conceded by Ahmed Hegazi.
60' Corner, Bristol City. Conceded by Ahmed Hegazi.
51' Corner, Bristol City. Conceded by Sam Johnstone.
20' Corner, West Bromwich Albion. Conceded by Niki Mäenpää.
19' Corner, West Bromwich Albion. Conceded by Adam Webster.
13' Corner, Bristol City. Conceded by Ahmed Hegazi.
7' Corner, Bristol City. Conceded by Sam Johnstone.
2' Corner, Bristol City. Conceded by Sam Johnstone.
전반적인 목표는 1개 이상 떨어진 줄에서 일치하는 항목의 총 수를 얻는 것입니다. 따라서 파일에는 간단한 wc -l
. 성냥.
따라서 위의 예에서 "19 & 20"은 함께 그룹화되어야 총 개수가 8개의 "독립" 행이 됩니다. (선은 다른 숫자와 1 이상 차이가 나면 독립된 것으로 간주됩니다.)
예를 들어, 위 예에서 21로 시작하는 행이 있는 경우 "19 & 20" 조회수로 그룹화되므로 출력은 여전히 8이 됩니다. "19와 같이 동일한 숫자를 가진 행도 있을 수 있습니다. & 19인치."
요구 사항을 고려하기 위해 더 복잡한 스크립트를 작성하지 않고 이것이 얼마나 가능한지는 잘 모르겠지만, 제 시간에 인상적인 sed/awk 줄을 본 적이 있으므로 그 중 하나가 작동하는 것이 가능할 수도 있습니다.
답변1
데이터 파일이 이미 정렬되어 있으므로 각 행의 첫 번째 값(첫 번째 행 이후)을 이전 값과 비교하기만 하면 됩니다. 숫자가 변환되었는지 확인하세요. 따라서 (댓글에서 제안한 대로) 원하는 것이 개수뿐이라면 다음과 같이 할 수 있습니다.
awk '
BEGIN { if(getline == 1) {last = $1+0; c = 1}}
last - $1 > 1 {c++}
{last = $1+0}
END {print c}
' file
답변2
ENDFILE을 처리하려면 GNU awk를 사용하십시오.
$ cat tst.awk
FNR==1 { prev=$1; cnt=1; fname=FILENAME; next }
(prev - $1) > 1 { cnt++ }
{ prev = $1 }
ENDFILE { print fname, cnt }
$ awk -f tst.awk *
file1 8
file2 3
file3 24
어떤 이상한 경우 :
$ cat tst.awk
FNR==1 {
if ( NR > 1 ) {
print fname, cnt
}
prev = $1
cnt = 1
fname = FILENAME
next
}
(prev - $1) > 1 { cnt++ }
{ prev = $1 }
END { print fname, cnt }