我想比较两个不同文件的第一列,如果匹配,则将两个文件的第二列和第三列的差异放入一个新文件中,第一列作为匹配条目。
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
答案 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)
一种方法是使用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
中的第二个括号检查第一列和第四列是否相同,如果是,则执行所需的减法。
答案 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