Найти соответствующий индекс на основе нескольких файлов и распечатать - PullRequest
0 голосов
/ 23 мая 2018

У меня 3 файла, как показано ниже, все 3 файла имеют одинаковое количество столбцов и строк (более сотен).То, что я хочу: найти столбец / строку, если число в File1 и File2 попадает в определенный диапазон, затем сохранить число в File3 с тем же индексом и подписать «0» для других чисел.Например: из File1 и File2, только числа в col2 / row2 могут соответствовать стандарту (0 <88 <100, 0 <6 <10), затем оставить номер 8 в File3 и присвоить «0» всем остальным номерам.Можно ли использовать awk для этого?Или питон?Спасибо. </p>

Файл1:

-10 -10 9 
-20 88 106 
-30 300 120

Файл2:

-6 0 -7
-5 6 1
-2 18 32

Файл3:

4 3 5 
6 8 8
10 23 14

вывод

0 0 0
0 8 0
0 0 0

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

У вас отличный ответ awk.

Вот как вы можете сделать это в Python с помощью numpy.

Сначала прочитайте файлы:

import numpy as np
arrays=[]
for fn in ('file1', 'file2', 'file3'):
    with open(fn) as f:
        arrays.append(np.array([line.split() for line in f],dtype=float))

Затем создайте матрицу маски для фильтрации для требуемых условий:

mask=(arrays[0]>0) & (arrays[0]<100) & (arrays[1]>0) & (arrays[1]<10)

Затем умножьте третий массив (arrays[2] это третий файл) по маске:

>>> arrays[2] * mask.astype(float)
[[0. 0. 0.]
 [0. 8. 0.]
 [0. 0. 0.]]
0 голосов
/ 23 мая 2018

После awk поможет здесь.

awk '
FNR==1                 { count++             }  ##Checking condition if FNR==1 then increment variable count with 1 each time.
count==1               {                        ##Checking condition if count is either 1 or 2 if yes then do following.
   for(i=1;i<=NF;i++)  {                        ##Starting a usual for loop from variable value 1 to till value of NF here and doing following.
     if($i>0 && $i<100){ a[FNR,i]++          }  ##Checking condition if a field value is greater than 0 and lesser than 100 then increment 1 count for array a whose index is line_number and column_number here. So this will have the record of which ever line whichever column has values in range and if count is 2 then we should print it.
}}
count==2               {
   for(i=1;i<=NF;i++)  {
     if($i>0 && $i<10) { a[FNR,i]++          }
}}
count==3               {                        ##Checking condition if variable count is 3 here then do following.
   for(j=1;j<=NF;j++)  { $j=a[FNR,j]==2?$j:0 }; ##Starting a for loop here from 1 to till NF value and checking condition if array a with index of line_number and column_number is 2(means both File1 and File2 have same ranges) then keep its same value else make it 0 as per OP request.
   print                                     }  ##Printing the current line edited/non-edited value here.
' File1 File2 File3                             ##Mentioning all Input_file(s) here.

Вывод будет следующим.

0 0 0
0 8 0
0 0 0
...