다음과 같은 CSV 파일이 있습니다. (두 번째 열은 날짜 패턴입니다.)
qqq.eee,2015-10-12
rrr-ttt,2015-11-23
aaapppp,2022-01-10
ddd_fff,2017-05-23
zzzbbbb,2013-09-20
nnnmmmm,2015-06-17
wwwwwww,2014-11-20
uuu-uuu,2016-12-10
ppppppp,2015-10-19
kkkkkkk,2016-12-25
다음과 같이 두 번째 열에서 일치하는 행을 가져오고 싶습니다.
year between two number(for example): 2014<= year =<2016
month between two number(for example): 10<= month =<12
day between two number(for example): 20<= day =<30
그런 다음 다음과 같이 출력을 얻습니다.
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
awk를 사용하여 이를 달성할 수 있습니까?
답변1
awk
열 및 다중 조건 필터링에 가장 적합합니다. 그러나 이 특정 문제는 다음을 통해 해결될 수도 있습니다.grep
$ grep -E '201[4-6]-1[0-2]-(2[0-9]|30)$' ip.csv
rrr-ttt,2015-11-23
wwwwwww,2014-11-20
kkkkkkk,2016-12-25
-E
확장 정규식 사용201[4-6]
2014~2016년 범위1[0-2]
범위는 10~12입니다.2[0-9]
범위는 20~29입니다.- 그룹화 및 교대를 사용하여
(2[0-9]|30)
20~30의 범위를 제공합니다.
- 그룹화 및 교대를 사용하여
$
줄 끝- 추가 자료:http://www.regular-expressions.info/numericranges.html
답변2
구분 기호 때문에 끝부터 시작까지만 비교하게 되네요.
awk -F[-,] '$NF >= 20 && $NF <= 30 && $(NF-1) >= 10 &&
$(NF-1) <= 12 && $(NF-2) >= 2014 && $(NF-2) <= 2016' yourfile
NF
마지막 필드,$NF
값,$(NF-1)
마지막 필드 앞의 필드 값 등$NF
일, 월 , 연도$(NF-1)
$(NF-2)