正規表現と2番目のファイルを使用した.txtファイルのフィルタリング

正規表現と2番目のファイルを使用した.txtファイルのフィルタリング

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

そしてあなたが提供した予想出力。

おすすめ記事