从使用awk不同的文件减列 [英] subtract columns from different files with awk

查看:107
本文介绍了从使用awk不同的文件减列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个文件夹A1和A2。的名称和文件的数量是在这两个文件夹相同。每个文件都有15列。在文件夹A1的每个文件的第6列需要从每个文件的文件夹中的第6栏A2衬底。我想打印每个文件列2和6(扣除后)到一个文件夹与A3相同的文件名。我怎样才能做到这一点使用awk?

  f1.txt文件夹中的文件A1RAM AA 159.03 113.3 122.9 116.3 34.78
RAM BB 151.24 70 122.9 142.78 66.4
RAM CC 156.70 80 86.2 70.1 54.8
  在文件夹A2 f1.txt文件RAM AA 110.05 113 122.9 34.78 116.3
RAM BB 150.15 70 122.9 140.60 69.4
RAM CC 154.70 89.2 86.2 72.1 55.8
所需的输出AA 0
BB 2.18
CC -2


解决方案

使用的一种方法 AWK

 的awk'FNR == {NR阵列[$ 1 = $ 2;接下来} {如果($ 1阵列)打印$ 1,数组[$ 1]  -  $ 2  - ; A3 / f1.txt}〜/ A1 / f1.txt〜/ A2 / f1.txt


第一次编辑:

假设在这两个目录中的文件的数量相等( A1 A2 )使用的方式配对的文件名,你描述:

 为我在A1 / *;做AWK -v FILE = A3 / $ {I / A1 \\ //}'FNR == {NR阵列[$ 1 = $ 2;接下来} {如果($ 1阵列)打印$ 1,数组[$ 1]  -  $ 2  - ; FILE}'A1 / $ {I / A1 \\ //} A2 / $ {I / A1 \\ //}; DONE

您需要将 A3 首先创建目录,否则你会得到一个错误。

第二编辑:

 的awk'FNR == {NR阵列[$ 2] = $ 6;接下来} {如果($ 2阵列)打印$ 2,数组[$ 2]  -  $ 6' A3 / f1.txt}〜/ A1 / f1.txt〜/ A2 / f1.txt

第三编辑:

 为我在A1 / *;做AWK -v FILE = A3 / $ {I / A1 \\ //}'FNR == {NR阵列[$ 2] = $ 6;接下来} {如果($ 2阵列)打印$ 2,数组[$ 2]  -  $ 6' FILE}'A1 / $ {I / A1 \\ //} A2 / $ {I / A1 \\ //}; DONE

I have two folders A1 and A2. The names and the number of files are same in these two folders. Each file has 15 columns. Column 6 of each file in folder 'A1' needs to substrate from the column 6 of each file in folder 'A2'. I would like to print column 2 and 6(after subtraction) from each file to a folder A3 with the same filenames. How can I do this with awk?

f1.txt file in folder A1

RAM     AA   159.03  113.3  122.9  34.78    116.3 
RAM     BB   151.24   70    122.9  142.78   66.4
RAM     CC   156.70   80    86.2   70.1     54.8


  f1.txt file in folder A2    

RAM     AA   110.05  113    122.9    34.78    116.3
RAM     BB   150.15  70     122.9    140.60   69.4 
RAM     CC   154.70  89.2   86.2     72.1     55.8


desired output

AA   0
BB  2.18
CC  -2

解决方案

One way using awk:

awk 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt


FIRST EDIT:

Assuming an equal number of files in both directories (A1 and A2) with filenames paired in the way you describe:

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$1]=$2; next } { if ($1 in array) print $1, array[$1] - $2 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done

You will need to create the directory A3 first, or you'll get an error.

SECOND EDIT:

awk 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > "A3/f1.txt" }' ~/A1/f1.txt ~/A2/f1.txt

THIRD EDIT:

for i in A1/*; do awk -v FILE=A3/${i/A1\//} 'FNR==NR { array[$2]=$6; next } { if ($2 in array) print $2, array[$2] - $6 > FILE }' A1/${i/A1\//} A2/${i/A1\//}; done

这篇关于从使用awk不同的文件减列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆