如何在两个矩阵之间进行过滤?

Owe*_*wen 7 text-processing

文件1:

91  23  56  44  87  77
99  34  56  22  22  95
41  88  26  79  60  27
95  55  66  69  92  25
Run Code Online (Sandbox Code Playgroud)

文件2:

pass fail pass pass pass fail
pass fail pass fail fail pass
pass pass fail pass pass fail
pass pass fail pass pass fail
Run Code Online (Sandbox Code Playgroud)

因为我想总结每行的总失败标记,这里是预期的输出。

输出:

100
78
53
91
Run Code Online (Sandbox Code Playgroud)

我想问一下,如何根据file2中的“fail”这个词对file1进行过滤,以获得失败标记的总和。

Tho*_*hor 10

我会使用矩阵语言来完成这样的任务,例如 GNU Octave。

假设您将通过/失败文件转换为数值,例如:

sed 's/pass/1/g; s/fail/0/g' passfail > passfail.nums
Run Code Online (Sandbox Code Playgroud)

您现在可以执行以下操作:

sed 's/pass/1/g; s/fail/0/g' passfail > passfail.nums
Run Code Online (Sandbox Code Playgroud)

输出:

marks    = dlmread('marks');
passfail = dlmread('passfail.nums');

for i = 1:size(marks)(1)
  sum(marks(i,:)(passfail(i,:) == 0))
end
Run Code Online (Sandbox Code Playgroud)


小智 7

虽然我认为使用awk有利于可移植性,但其他语言似乎更容易编写和阅读此任务。提到了 GNU Octave,但大多数机器上都没有预装。另一方面,大多数系统都预装了 python 版本。这是一个python版本:

for marks, decisions in zip(open('file1').readlines(), open('file2').readlines()):
    row_score = 0
    for mark, decision in zip(marks.split(), decisions.split()):
        if decision == 'fail':
            row_score += int(mark)
    print(row_score)
Run Code Online (Sandbox Code Playgroud)

它返回您期望的输出。


jim*_*mij 6

这是我的awk方法:

awk 'NR==FNR{for(i=1;i<=NF;i++) a[NR"-"i]=$i; next} \
            {for(j=1;j<=NF;j++) if($j=="fail") b[FNR]+=a[FNR"-"j]} \
         END{for(k in b) print b[k]}' file1 file2
Run Code Online (Sandbox Code Playgroud)

awk 不支持二维数组,所以我们通过在同一个数组索引中组合两个数字(行和字段)来制作二维数组。输出是:

100
78
53
91
Run Code Online (Sandbox Code Playgroud)


Rud*_*diC 4

我认为你不需要一个END部分:

awk '
NR == FNR       {for (i=1; i<=NF; i++) F[i,NR] = $i
                 next
                }
                {T = 0
                 for (i=1; i<=NF; i++) T += ($i=="fail")?F[i,FNR]:0
                 print T
                }
' file[12]
100
78
53
91
Run Code Online (Sandbox Code Playgroud)