Text-Processing
使用正則表達式和第二個文件過濾 .txt 文件
我有一個 file.txt (每行的列數不同):
例如
1 21:10 21:23 2 1:94 1:100 1:123 3 14:1 14:60 14:23
我有另一個文件(file2.txt),其中包含 4 列(用“”分隔)
a 21 20 60 b 2 80 90 c 14 50 100 d 2 10 20 e 14 1 12
我想檢查第一個文件的每一行的初始部分(21;1;14,每一行都相等)並選擇在第二個文件中的值之間具有“:”之後部分的元素(3th 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 21:23 2 14:1 14:60
(第 2 行被刪除,因為 1 不包含在 file2.txt 的第 2 列的任何單元格中)
假設您的意思是
<=
不是<
因為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
以及您提供的預期輸出。