2012-08-10 67 views
2

我有两个文件夹A1和A2。这两个文件夹中的文件名称和文件数量相同。每个文件有15列。文件夹“A1”中每个文件的第6列需要从文件夹“A2”中每个文件的第6列开始。我想从每个文件中将第2列和第6列(减法后)打印到具有相同文件名的文件夹A3中。我怎样才能用awk做到这一点?用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 
+0

难道你们,请回答这个问题,那么: http://stackoverflow.com/questions/ 15049478/subtructing-n-number-of-columns-from-two-files-with-awk – 2013-02-24 07:14:55

回答

3

方式一:

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 

先编辑:

假设在两个目录与​​你所描述的方式配对的文件名相同的文件数(A1A2) :

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 

您需要先创建目录A3,否则会出现错误。

第二个编辑:

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 

第三编辑:

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 
+0

谢谢你的回答。我的文件有15列。我想在减去column6的值后打印column2和column6。我在代码中更改了$ 2,$ 6而不是$ 1,$ 2。减法的结果不正确。我如何更改您的代码以获取正确的值? – user1588971 2012-08-10 08:40:48

+0

@ user1588971:我无法解释您的请求。请考虑使用15列文件的示例更新您的问题,以及您期望的输出示例。我已经编辑了我认为你所要求的内容,但我可能完全错误地解释了这个问题。 – Steve 2012-08-10 10:29:21

+0

谢谢您的评论。我编辑了我的问题。 – user1588971 2012-08-10 11:18:57

12

试试这个:

paste {A1,A2}/f1.txt | awk '{print $2,$6-$13}' 

bash{A1,A2}/f1.txt将扩大到A1/f1.txt A2/f1.txt(这只是一个快捷方式没关系。)
我使用paste命令垂直合并文件。
这里的awk命令很简单。使用awk

+0

'join'是一个shell c ommand(bash)? '{}'指定输入文件集,'/'输出文件? – Levon 2012-08-10 02:41:26

+0

是的,我在'bash'(Ubuntu 12.04)中测试它。 – kev 2012-08-10 02:42:34

+0

谢谢 - 提供一些基本解释与解决方案,使我认为更好和更有用的答案。 – Levon 2012-08-10 02:44:56