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