다음 형식의 데이터가 포함된 파일이 있습니다.
입력 파일
"1930","1946","FOO","BAR","GREEN"
"1949","1962","FOO","BAR","BLUE"
"1970","1980","FOO","BAR","YELLOW"
숫자가 연속적이지 않고 가끔 큰 간격이 있는 경우도 있습니다. 처음 두 열 사이에 일치하는 숫자에 대해 다음과 일치하는 행이 반환되기를 원합니다.
예:
번호 1952의 예상 출력
1952:
"1949","1962","FOO","BAR","BLUE"
AWK 또는 다른 bash 스크립트가 가능합니다.
답변1
$ awk -F',' -v y=1952 'BEGIN{print y":"} {line=$0;gsub("\"","");} $1+0<=y && y<=$2+0 {print line}' file
1952:
"1949","1962","FOO","BAR","BLUE"
어떻게 작동하나요?
-F','
그러면 필드 구분 기호가 쉼표로 설정됩니다.
-v y=1952
이는
y
값이 1952인 awk 변수를 정의합니다.BEGIN{print y":";}
그러면 헤더 행이 인쇄됩니다.
line=$0; gsub("\"","")
이렇게 하면 원래 행이 로 저장됩니다
line
. 그런 다음 필드에서 큰따옴표를 제거합니다.$1+0<=y && y<=$2+0 {print line}
값이
y
첫 번째 열과 두 번째 열의 값 사이에 있으면 원본을 인쇄합니다line
.위 행에서는 첫 번째 열과 두 번째 열의 숫자에 0이 추가되었습니다. 이렇게 하면 awk가 이러한 열을 문자열이 아닌 숫자로 처리하므로 문자열 비교가 아닌 숫자 비교를 수행합니다.
답변2
보다 구체적인 필드 구분 기호를 사용하면 다음과 같은 컴팩트 awk
솔루션이 가능합니다.
awk -F '(","|^"|"$)' -v d=1952 'd>=$2 && d<=$3'
참고: 필드 구분 기호 선택으로 인해 여기서 필드 $2
및 필드 $3
는 자체 필드입니다 . "$
모든 행에 두 개의 날짜만 있고 더 이상 데이터가 없을 수 있는 보다 일반적인 경우를 위해 닫는 따옴표( )가 추가됩니다. 다른 댓글에서 언급했듯이 제목은 생략되었습니다 BEGIN{print d":"}
. 그렇지 않으면 주요 부분이 d>=$2 && d<=$3
설명됩니다.
답변3
더 짧게 awk
:
$ awk -F\" -vn=1952 '$2<=n && $4>=n' file
"1949","1962","FOO","BAR","BLUE"
위 내용은 awk
대부분의 경우 에 적용됩니다 nawk
.
awk
예를 들어 원본에서 파생된 구현을 사용하려면 다음 oawk
이 필요합니다.
oawk -F\" 'BEGIN{n=1952}$2<=n && $4>=n'
답변4
awk ' y>=nq($1) && y<=nq($2)
function nq(s) {return gensub(/^"|"$/,"","g",s)}
' F=, y=1951 file
또는 원하는 경우 매개변수 대신 변수 F
abn을 y
변수 바로 뒤에 넣을 수 있습니다.awk
awk -F, -vy=1951