다음 데이터가 포함된 텍스트 파일을 읽으려고 합니다.
LNAME FNAME MNAME MAJOR DATE
Smith Jane Chem Date:[somedate]
Doe Joanne Victoria ENG Date:[today]
이 예에서 [somedate]는 오늘을 제외한 모든 날짜를 의미하고, [today]는 오늘 날짜를 의미합니다. 내 생각은 awk를 사용하여 오늘 등록된 모든 학생을 필터링하는 것입니다. 날짜 형식은 2022-06-21입니다.
어떤 도움이라도 대단히 감사하겠습니다.
답변1
grep -v "Date:$(date +%F)\$" < file
Date:
YYYY-MM-DD 형식으로 끝나지 않는 현재 날짜의 행이 반환됩니다 .
를 사용하면 zsh
다음을 호출하지 않고도 이 작업을 수행할 수 있습니다 date
.
grep -v Date:${(%):-%D{%F}}$ < file
GNU 구현은 awk
현재 날짜 자체를 얻을 수도 있습니다.
gawk 'BEGIN {search = strftime("Date:%F")}
$NF != search' < file
공백으로 구분된 마지막 필드가 아닌 행을 반환합니다 Date:[today]
.
로 변경:
gawk 'BEGIN {search = strftime("Date:%F")}
NR == 1 || $NF != search' < file
타이틀도 인쇄할 수 있습니다.
awk
GNU 이외의 시스템에서는 awk
다음을 수행할 수 있습니다:
awk -v search="$(date +Date:%F)" '
NR == 1 || $NF != search' < file
또는:
awk 'BEGIN {"date +Date:%F" | getline search}
NR == 1 || $NF != search' < file
(이 방법은 쉘 코드를 해석하기 위해 추가 쉘 호출을 실행하지만 date +Date:%F
이 방법은 스크립트에서만 유용합니다 #! /usr/bin/awk -f
.)
입력을 공백을 구분 기호로 사용하여 일종의 csv로 구문 분석할 수 있는 경우 csvkit의 다음을 사용할 수도 있습니다 csvgrep
.
<file csvgrep -d ' ' -c DATE -r "$(date +'^Date:%F$')"
여기 현장에서 경기가 있습니다 DATE
.
그러나 출력은 쉼표로 구분된 값입니다. 파이프를 통해 구분 기호를 쉼표 대신 공백으로 다시 변경할 수 있습니다 csvformat -D ' '
.
답변2
이것은 나에게 효과적입니다.
awk -F'[ :]' -v dt="$(date +'%F')" '$NF != dt' filename
-F'[ :]'
필드 구분 기호로 공백이나 콜론을 사용하도록 awk에 지시-v
awk에게 다음을 변수로 사용하도록 지시하세요.dt="$(date +'%F')"
dt
현재 날짜를 YYYY-MM-DD 형식으로 설정'$NF != dt'
"마지막 필드가 현재 날짜와 같으면 이 행을 무시하세요"라고 말합니다.
답변3
현재 날짜를 얻으십시오.명령 대체 그리고 $NF를 비교해보세요:
awk -F, -v date="$(date +%F)" '$NF == date' FILE
답변4
일반적으로 AWK의 마지막 필드를 필터링하려면 $NF == "text"
or를 사용하여 보다 일반적으로 만들어야 합니다. $NF == value
여기서 value는 적절한 콘텐츠가 있는 변수입니다. 예를 들어 $NF
로 변경하여 모든 필드(열 필터링)에 적용할 수 있습니다. ()는 오늘 등록하는 모든 학생을 (수용)합니다. 이를 거부하려면 동일한 논리적 결과를 사용하거나 둘 다 제공할 수 있습니다.$3
3
==
filter in
$NF != value
!($NF == value)
일치시킬 값은 [today]
원하는 값일 Date:[today]
수 있습니다. Date:2022-06-21
변수의 내용을 value
정확히 필요한 것과 동일하게 만들면 이 awk 명령이 해당 값이 포함된 행을 "필터링"합니다. 필드 구분 기호가 탭이라고 가정합니다.
awk -v value="Date:[2022-06-21]" '$NF != value' infile
-F","
필드 구분 기호가 쉼표인 경우 a를 추가하세요.
오늘 날짜를 얻으려면 bash(4.3+) 또는 ksh(93)를 사용하는 경우 셸을 사용할 수 있습니다.
printf -v value 'Date:[%(%F)T]'
awk -v value="$value" '$NF != value' infile
스크립트의 첫 번째 줄이 헤더이고 이를 인쇄하려면 다음을 추가하세요.
printf -v value 'Date:[%(%F)T]'
awk -v value="$value" '($NF != value) || (NR==1)' infile
또는 임의의 셸에서:
value="Date:[$(date +'%F')]"
awk -v value="$value" '($NF != value) || (NR==1)' infile
일부 버전의 awk에서는 날짜를 직접 얻을 수 있습니다.
awk 'BEGIN{ value = "Date:[" strftime("%F") "]" } ($NF != value) || (NR == 1)' infile
==
정밀도가 필요한 문자열 비교를 수행합니다 . 관련 테스트는 덜 엄격한 일치를 허용하는 정규식 일치 ~
(또는 negation )입니다( 예를 들어 "올해"와 일치하는 데 사용될 수 있음) .!~
$NF ~ /2022/
2022