我想比较两个不同文件的第一列,如果有匹配项,请将两个文件的第二列和第三列的差异放入一个新文件中,第一列作为匹配的条目。
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
一种方法是使用 paste
和 awk
-
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