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



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

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

使用 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 as,把下面的内容放在一个名为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

这将做到这一点 - 它是纯粹的 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 %dn" $m1 $((m2 - m3)) $((n2 - n3))
  fi
done 3< file1.txt 4< file2.txt

输出:

12 -2 -1
13 -2 -3

一种方法是使用 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中的第二个大括号检查第一列和第四列是否相同,如果是,则进行所需的减法。

in 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

最新更新