생일이 포함된 텍스트 파일이 있습니다.
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/7
date
04/07
awk
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