오늘부터 생일을 순서대로 나열하세요

오늘부터 생일을 순서대로 나열하세요

생일이 포함된 텍스트 파일이 있습니다.

1/23 Horace
3/1 Taraneh
7/14 Valerian
11/31 Carmen

생일을 보여주고 싶어요오늘부터.
예를 들어 오늘이 4/7(4월 7일)인 경우:

7/14 Valerian
11/31 Carmen
1/23 Horace
3/1 Taraneh

Bash 스크립트에서 이 작업을 어떻게 수행합니까?

패턴을 기반으로 텍스트 파일을 분할하는 방법을 찾았습니다.(그런 다음 분할을 역순으로 연결할 수 있습니다)하지만 여기서 중요한 점은 오늘 날짜가 없을 수도 있고 여러 사람의 생일일 수도 있다는 것입니다.

참고: 모든 날짜는 유효한 날짜입니다.

답변1

어쩌면 다음과 같은 것일 수도 있습니다.

date +'%m/%d 0000' |
  sort -nt/ -k1 -k2 - birthdays.txt |
  awk '$2 == "0000" {past_today = 1; next}
       past_today {print; next}
       {next_year = next_year $0 RS}
       END {printf "%s", next_year}'

즉, 날짜별로 정렬하기 전에 행을 삽입한 다음 04/07 0000(일부 구현에서는 date +%-m/%-d이를 출력하지만 이식 가능하지 않으며 효과도 동일함) 해당 행 앞의 행을 끝으로 이동합니다.4/7date04/07awk

sort ... - birthdays.txt

표준 입력( 로 표시됨 -, 여기서는 파이프로 제공됨 ) 및 date의 내용을 정렬합니다 birthdays.txt.

키 구분 기호를 /with 로 설정 -t/하여 -k1줄의 시작부터 줄 끝까지 정렬 키를 지정하고(본질적으로 -k1전체 줄을 정렬 키로 지정) 첫 번째 문자 다음의 첫 번째 문자부터 첫 번째 문자까지를 지정합니다. -k2문자 정렬 키. /줄 끝이지만 의 경우 -n숫자로 해석되므로 숫자의 초기 순서만 ​​중요합니다.

bash(위의 내용은 Bourne과 같은 쉘(포함 ) 에서 작동하며 bash이를 위해서는 설치가 필요하지 않습니다.)

답변2

먼저 "/"의 공백을 변경하고 정렬하십시오.

sed 's|/| |' data | sort -k1,1n -k2,2n >out.tmp

다음으로 이전 날짜와 이후 이전 날짜를 출력합니다.

awk -v m=4 -v d=7 '$1 > m || $1 == m && $2 >= d' out.tmp
awk -v m=4 -v d=7 '$1 < m || $1 == m && $2 <  d' out.tmp

관련 정보