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、すべての行が同じです)を確認し、2番目のファイル(3rd e)の値の間に「:」の後にある部分の要素を選択したいと思います。 4列目) 列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行のみ)これを許可します。
前任者。結果:
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
そしてあなたが提供した予想出力。