如何比较两个文件的第一列并打印第二列和第三列的差异?

时间:2017-01-03 06:18:01

标签: bash shell awk solaris

我想比较两个不同文件的第一列,如果匹配,则将两个文件的第二列和第三列的差异放入一个新文件中,第一列作为匹配条目。

Output File = Matched,Difference of c2 and c3 of file1,Difference of c2 and c3 of file 2

示例:

档案1

12,1,3 
13,2,4 
14,5,7

文件2

12,4,5
13,4,7
15,3,9

所需的输出文件

12 -2 -1
13 -2 -3

请告诉我怎么做这个。 文件长度不一。 File1的长度为100,File2的长度为20

4 个答案:

答案 0 :(得分:2)

使用更适合此的awk

awk 'BEGIN{FS=","}FNR==NR{array1[$1]=$2-$3; next}($1 in array1){array2[$1]=$2-$3}END{for (i in array2){print i,array1[i],array2[i]}}' file1 file2
12 -2 -1
13 -2 -3

如果awk中的Solaris不是原生的,您可以尝试nawk,将以下内容放在名为nawk_script.awk

的文件中
BEGIN{FS=","}
FNR==NR{array1[$1]=$2-$3; next}($1 in array1){array2[$1]=$2-$3}
END{for (i in array2){print i,array1[i],array2[i]}}

并将其作为

运行
nawk -f nawk_script.awk file1 file2

答案 1 :(得分:1)

这样做 - 它是纯粹的bash并且不会分叉任何子进程:

#!/usr/bin/env bash

# the following loop will end when an EOF is encountered on
# either of the two input files, whichever happens first.
while IFS=, read -r m1 m2 m3 <&3 && IFS=, read -r n1 n2 n3 <&4; do
  if [[ $m1 == $n1 ]]; then
    printf "%d %d %d\n" $m1 $((m2 - m3)) $((n2 - n3))
  fi
done 3< file1.txt 4< file2.txt

输出:

12 -2 -1
13 -2 -3

答案 2 :(得分:0)

一种方法是使用pasteawk -

paste file1 file2 | awk '{gsub(",", " " , $0)} {if ($1 == $4) print $1, $2-$3, $5-$6}'

输出 -

12 -2 -1
13 -2 -3

解释 -

paste命令并排粘贴文件。 awk gsub命令将逗号更改为空格。 awk中的第二个括号检查第一列和第四列是否相同,如果是,则执行所需的减法。

答案 3 :(得分:0)

在awk中。如果$1尚未在数组a中,则将值减去并存储到数组中。如果已经存在,则打印密钥,a中的值和减法的值。 13之前的空格已经在您的数据中:

$ awk -F, '!($1 in a){ a[$1]=$2-$3; next } { $3=$2-$3; $2=a[$1] } 1' f1 f2
12 -2 -1
 13 -2 -3