.txt
다음과 같은 구조의 파일이 있습니다 .
20170515000650883,208,-32,-896,stand
20170515000651883,336,96,-928,stand
20170515000652982,368,64,-896,stand
20170515000653982,256,-48,-816,lie
20170515000654982,368,48,-832,lie
20170515000655982,15081,32,-688,lie
20170515000656982,15081,48,-864,lie
20170515000657983,15081,112,-1072,lie
20170515000658983,15081,-32,-992,lie
20170515000659983,15081,-48,-1072,lie
20170515000700983,15081,-32,-880,lie
20170515000701983,15081,16,-832,stand
20170515000702983,15081,-48,-720,stand
20170515000703983,15081,0,-896,stand
20170515000704983,15081,112,-880,lie
20170515000705983,15081,-48,-1072,lie
...
lie
내 목표는 마지막 열에 표시된 이벤트를 검색하는 것입니다 . 이것이 내가 깨달은 것이다
sed -n '13,$s/lie/&/p' $subj > $SUBJECTS_DIR/temp.txt
나는 13번째 줄부터 검색을 시작했고 "거짓말"이 포함된 모든 줄을 임시 파일에 저장했습니다. 그런데 sed 명령 중에 데이터를 수집할 수 있나요? 첫 번째 열에는 타임스탬프가 포함되어 있습니다. 따라서 lie=TRUE일 때 column_1에서 값을 수집하고 싶습니다. 또한 시퀀스의 마지막 거짓말이 발생하면(총 8개의 "거짓말") 시차. 검색은 파일 끝까지 계속되어야 합니다. 해당 기간 동안 이 정보를 수집하는 방법을 아는 사람이 있나요? sed?
답변1
이를 위해 awk를 사용할 수 있습니다.
awk -F"," '/lie/{a[++i>2?2:i]=$1}END{print a[2] - a[1] }' input.txt
awk 명령은 "lie"와 일치하는 첫 번째이자 가장 최근의 타임스탬프를 배열에 저장합니다. 파일을 읽은 후 awk는 마지막 일치 항목에서 첫 번째 일치 항목을 뺍니다.
답변2
"시차"가 무엇인지는 확실하지 않지만 "거짓말"이 포함된 첫 번째 열은 다음과 같이 간단히 확장할 수 있습니다.
cat data.txt | grep lie | sed "s/,.*,lie//g"
grep
"거짓말"이 없는 모든 행을 삭제하고 sed
첫 번째 열을 제외한 모든 행을 삭제합니다.
그런 다음 배열로 변환하고 bash에서 원하는 숫자를 사용할 수 있습니다
답변3
이 글을 게시하기에는 너무 늦을 수 있습니다:
sed -nE '13,$ s/([^,]*).*lie$/\1/p' in.txt
어디:
-nE
:-
- -n은 --quiet, --silent를 나타냅니다. 패턴 공간을 자동으로 인쇄하지 않습니다.
- -n은 --quiet, --silent를 나타냅니다. 패턴 공간을 자동으로 인쇄하지 않습니다.
-
-E
--regexp-extended : 확장 정규식 사용
([^,]*)
: 타임스탬프 캡처.*lie$
: 줄이 "거짓말"로 끝나는지 확인하세요.
그러므로: 라인 13에서 시작하는 "거짓말"의 타임스탬프를 반환합니다.