file.txt가 있습니다(각 행의 열 수가 다릅니다).
예를 들어
1 21:10 21:23
2 1:94 1:100 1:123
3 14:1 14:60 14:23
4개의 열(""로 구분)이 포함된 다른 파일(file2.txt)이 있습니다.
a 21 20 60
b 2 80 90
c 14 50 100
d 2 10 20
e 14 1 12
첫 번째 파일의 각 줄의 초기 부분(21;1;14, 모든 줄이 동일함)을 확인하고 두 번째 파일(3rd e)의 값 사이에 ":" 뒤에 있는 부분의 요소를 선택하고 싶습니다. 네 번째 열) 열 2가 ":" 앞의 부분과 동일한 경우에만 해당
예를 들어 다음과 같이 계산합니다.
> file.txt: 1th row: 21:10 21:23 --> 21 is in a in file2.txt so 20<10<60 NO
> but 20<23<60 is true so I take it.. and so on, I see for each row in file2.txt
다른 예시:
file.txt: 3th row: 14:1 14:60 14:23 --> 14 is in c and e in file2.txt so
50<1<100 NO (for c)
50<60<100 YES (for c)
50<23<100 NO (for c)
1<1<12 YES (for e)
1<60<12 NO (for e)
1<23<12 NO(for e)
요소가 2개의 값 사이에 있는 경우(file2.txt의 한 줄에 대해서만) 이를 허용합니다.
전임자. 결과:
1 21:23
2 14:1 14:60
(file2.txt의 2열 셀에 1이 포함되어 있지 않아 2행이 삭제되었습니다.)
답변1
그렇기 때문에 라기 <=
보다 진심이라고 가정하면<
1<1<12
아니요 YES
:
$ cat tst.awk
NR==FNR {
cnt[$2]++
beg[$2,cnt[$2]] = $3
end[$2,cnt[$2]] = $4
next
}
{
out = ""
for (i=2; i<=NF; i++) {
split($i,parts,/:/)
key = parts[1]
for (j=1; j<=cnt[key]; j++) {
if ( (beg[key,j] <= parts[2]) && (parts[2] <= end[key,j]) ) {
out = out OFS $i
break
}
}
}
if ( out != "" ) {
print ++outNr out
}
}
$ awk -f tst.awk file2 file1
1 21:23
2 14:1 14:60
위 내용은 귀하가 제공한 2개의 입력 파일을 사용하여 테스트되었습니다.
$ tail file1 file2
==> file1 <==
1 21:10 21:23
2 1:94 1:100 1:123
3 14:1 14:60 14:23
==> file2 <==
a 21 20 60
b 2 80 90
c 14 50 100
d 2 10 20
e 14 1 12
그리고 귀하가 제공한 예상 출력.