Awk - 通过比较两个文件进行循环

时间:2014-01-03 22:59:17

标签: for-loop awk

我有两个大文件。

文件1如下所示:

10 2864001 2864012
10 5942987 5943316

文件2如下所示:

10 2864000 28
10 2864001 28
10 2864002 28
10 2864003 27
10 2864004 28
10 2864005 26
10 2864006 26
10 2864007 26
10 2864008 26
10 2864009 26
10 2864010 26
10 2864011 26
10 2864012 26

所以我想以这样的方式创建一个for循环,

  1. 文件1的第一列必须匹配文件2的第一列AND
  2. 通过将文件1的第二列与第二列匹配来启动for循环 文件2的列和
  3. 归档文件2的第三列,直到文件1的第三列匹配 文件2的第二列。
  4. 所以上面例子的输出应该是File 1第一行的文件2的第三列的总和,它是347.我试图使用NR和FNR,但到目前为止我还没能做到。你能帮我生成awk脚本吗?

    非常感谢

2 个答案:

答案 0 :(得分:0)

转录,所以可能存在拼写错误:

awk '
BEGIN { lastFNR=0; acount=0; FIRST="T"}

FNR < lastFNR {FIRST="F"; aindex=0; next}

FIRST=="T" {
      sta[acount] = $2
      fna[acount] = $3
      acount += 1
      lastFNR=FNR         
}

FIRST=="F" && $2 >= sta[index] && $2 <= fna[aindex] {
      sum[aindex] += $3
      lastFNR = FNR
}

FIRST=="F" && $2 > fna[aindex] {
      aindex ==1
      if (aindex > acount) { FIRST="E" }
}

END {
      for(aindex=0; aindex<acount; +=aindex) {
            print sta[aindex], "through", fna[index], "totals", sum[aindex]
      }
}
' file 1 file2

答案 1 :(得分:0)

你可以尝试

awk -f s.awk file1 file2

其中s.awk

NR==FNR {
    a[$1,$2]=$3
    next
}
($1,$2) in a {
    do {
        s+=$3
        if ((getline)+0 < 1) break
    } while ($2 != a[$1,$2])
    print s
}
{ s=0 }

输出:

319