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

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

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

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숫자로 해석되므로 숫자의 초기 순서만 ​​중요합니다.

(위의 내용은 Bourne과 유사한 쉘( 포함)에서 작동하므로 이를 위해 bash설치할 필요가 없습니다 .)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

관련 정보