2017-09-04 81 views
1

我有以下格式的2个文件。从2个文件中减去列并输出到新文件

File1_Stored.txt 
ABC:100, 83 
ABC:84, 53 
ABC:14, 1222 

File2_Stored.txt 
ABC:100 , 83 
ABC:84 , 1553 
ABC:524 , 2626 

我想以下面的格式得到第三个文件。所以,当差值为0它不应该出现,但如果diffence不为0,那么它应该出现像

Value , File1 Value , File2 Value , Difference 
---------------------------------------------- 
ABC:84, 53   ,1553   , -1500 
ABC:14, 1222  , 0   , 1222 
ABC:524, 0   ,2626   ,-2626 

我试图做它用awk,以获得差异,但它未能

awk 'NR==FNR{A[$1]=$2;B[$1]=$2}{$2-=A[$1]}1' File1_Stored.txt File2_Stored.txt 

任何帮助是非常appriciated。

问候,

+0

试试这个[链接](http://www.unix.com/shell-programming-and-scripting/ 150175-need-help-subtract-columns-2-files-output-new-file.html) –

+0

已经试过了。 –

+0

您的示例输出似乎不符合您的规则描述。请澄清你的问题。程序如何在第1行和第3行区分ABC。为什么是4列输出,只有2列输入(在ABC之后)。 ?祝你好运。 – shellter

回答

1
$ cat tst.awk 
BEGIN { 
    FS="[[:space:]]*,[[:space:]]*" 
    OFS="," 
    print "Value", "File1 Value", "File2 Value", "Difference" 
} 
NR==FNR { 
    a[$1] = $2 
    next 
} 
{ 
    diff = a[$1] - $2 
    if (diff != 0) { 
     print $1, a[$1]+0, $2, diff 
    } 
    delete a[$1] 
} 
END { 
    for (key in a) { 
     print key, a[key], 0, 0 
    } 
} 

$ awk -f tst.awk file1 file2 
Value,File1 Value,File2 Value,Difference 
ABC:84,53,1553,-1500 
ABC:524,0,2626,-2626 
ABC:14,1222,0,0 
+1

非常感谢 –

1

AWK溶液:

awk -F' *, *' 'BEGIN{ fmt="%s, %d, %d, %d\n" } # output format 
       NR==FNR{ a[$1]=$2; next } 
       { 
        d=a[$1]-$2; # difference 
        if ($1 in a && d==0) { delete a[$1]; next }; 
        printf fmt, $1,a[$1]+0,$2,a[$1]-$2; delete a[$1] 
       } 
       END{ 
        for(i in a) printf fmt, i,a[i],0,a[i]; # check for unmatched items 
       }' file1 file2 

输出:

ABC:84, 53, 1553, -1500 
ABC:524, 0, 2626, -2626 
ABC:14, 1222, 0, 1222 
1

awk脚本:

$ cat file.awk 
BEGIN { FS=" *, *" } 
NR==FNR { A[$1]=$2 ;  B[$1]=0 ; next } 
     { A[$1]=A[$1]+0 ; B[$1]=$2 } 
END { 
for (x in A) 
    { diff=A[x]-B[x] 
     if (diff!=0) { printf "%s,%s,%s,%s\n",x,A[x],B[x],diff } 
    } 
} 
  • BEGIN { FS=" *, *" }:定义输入字段分隔为)零或多个空格加b)一种加逗号c)中的零个或多个空格
  • NR==FNR:用于第一文件...
  • A[$1]=$2:存储在阵列A值和...
  • B[$1]=0:零出B阵列中的一个相关联的条目
  • { A[$1]=A[$1]+0...:用于第二FIL e将0添加到关联的A数组(如果它不存在,则创建新的A数组项),然后将当前记录值存储在数组中B
  • 此时,我们应该在两个数组中都有条目所有可能的键值
  • END {...}:处理输入文件完成后...
  • for (x in A):遍历数组的索引A
  • diff=...:找到相应的阵列之间的差值
  • if (diff!=0) ...:如果我们的差额,不接零打印结果

脚本在行动:

$ awk -f file.awk File1_Stored.txt File2_Stored.txt 
ABC:524,0,2626,-2626 
ABC:14,1222,0,1222 
ABC:84,53,1553,-1500 
相关问题