
생일이 포함된 텍스트 파일이 있습니다.
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
숫자로 해석되므로 숫자의 초기 순서만 중요합니다.
(위의 내용은 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