field1이 일치하고 field3의 날짜/시간이 첫 번째 field1 일치로부터 5분 이내인 경우 CSV 파일을 필터링하여 제거합니다.

field1이 일치하고 field3의 날짜/시간이 첫 번째 field1 일치로부터 5분 이내인 경우 CSV 파일을 필터링하여 제거합니다.

Raspberry Pi의 Ubuntu에서 쉘 스크립트를 사용하여 bash(쉼표로 구분된) CSV 목록에서 행을 삭제하려고 합니다.게임 1그리고3차전은 1차전의 첫 경기부터 5분(300초)도 채 안 남았습니다.}.

이것은 샘플 입력 파일입니다. 줄이 유지되거나 삭제되는 이유를 설명하기 위해 원하는 출력에 #을 사용하여 주석을 달았습니다. 내가 원하는 것은 댓글이 아니라 "삭제"라는 줄뿐입니다. 실제 입력 및 필터링된 출력 파일은 다음과 같습니다.

A11EEA,@N171WT,2021/03/06 12:37:25,700,0.1
A0FC0A,@N1624K,2021/03/06 13:37:33,1975,2.0
...et cetera

주석이 달린 원하는 출력이 있는 입력 파일:

A11EEA,@N171WT,2021/03/06 12:37:25,700,0.1     # Keep - 1st occurrence of Field-1
A0FC0A,@N1624K,2021/03/06 13:37:33,1975,2.2    # Keep - 1st occurrence of Field-1
AB8C37,@AAL2386,2021/03/06 13:45:43,4500,1.3   # Keep - 1st occurrence of Field-1
A55325,@N442MG,2021/03/06 15:28:06,600,0.4     # Keep - 1st occurrence of Field-1
AB8C37,@AAL2386,2021/03/06 13:50:46,4500,1.5   # Keep - more than 5 mins from line 3
AB0ED6,@UAL1470,2021/03/06 13:51:23,4925,1.6   # Keep - 1st occurrence of Field-1
AB8C37,@AAL2386,2021/03/06 13:52:48,4500,1.7   # Delete - less than than 5 mins from line 5
AB0ED6,@UAL1470,2021/03/06 13:56:30,4925,1.8   # Keep - more than 5 mins from line 6
AB0ED6,@UAL1470,2021/03/06 13:56:40,4925,1.9   # Delete - less than than 5 mins from line 8
AB8C37,@AAL2386,2021/03/06 13:56:49,4500,1.0   # Delete - less than than 5 mins from line 5**

** Line 7 of the original record is not considered because it is slated for deletion

이상적으로는 다음과 같은 작업을 반복적으로 수행하는 대신 awk/sed/sort/uniq를 사용하는 솔루션을 원합니다.

while IFS= read -r line
do
   IFS=, read -ra record <<< "$line"
   # ... do a bunch of stuff
done < "inputfile.csv"

이것을 시도했지만 awk작업의 복잡성과 잠재적인 반복으로 인해 금방 막히게 되었습니다.

돕다? 아름답나요?

답변1

두 날짜 사이의 초 단위 차이를 구하는 함수를 만든 awk다음 awk첫 번째 필드로 인덱싱된 배열에 마지막 "유효한" 날짜를 저장하여 비교에 사용할 수 있습니다. 예를 들면 다음과 같습니다.

awk '
function getDateDifference(a,b) {
    gsub(/[:/]/, " ", a)
    startDate = mktime(a)
    gsub(/[:/]/, " ", b)
    endDate = mktime(b)
    return int(endDate - startDate)   
}

BEGIN { FS=OFS="," } 

dates[$1]=="" || (dates[$1]!="" && getDateDifference(dates [$1],$3) > 300){
    print $0;
    dates[$1] = $3
}' input.txt

날짜를 비교하기 전에 특정 첫 번째 필드에 대해 색인화된 배열 값이 존재하는지 확인하여 첫 번째 일치 항목이 인쇄되는지 확인해야 합니다.

관련 정보