AWK는 날짜를 확인하고 오늘이면 해당 콘텐츠만 필터링합니다.

AWK는 날짜를 확인하고 오늘이면 해당 콘텐츠만 필터링합니다.

다음 데이터가 포함된 텍스트 파일을 읽으려고 합니다.

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

타이틀도 인쇄할 수 있습니다.

awkGNU 이외의 시스템에서는 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에 지시
  • -vawk에게 다음을 변수로 사용하도록 지시하세요.
  • 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로 변경하여 모든 필드(열 필터링)에 적용할 수 있습니다. ()는 오늘 등록하는 모든 학생을 (수용)합니다. 이를 거부하려면 동일한 논리적 결과를 사용하거나 둘 다 제공할 수 있습니다.$33==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

관련 정보