如何使用bash脚本获取FILE B中与其他FILE A不同的行?

问题描述:

我想使用bash脚本来做这件事,但我不能那样做。如何使用bash脚本获取FILE B中与其他FILE A不同的行?

这些是我的数据。

文件:

43477 102531 114783 4.115 -1.748 11.127 5.587
41777 50955 84639 -4.310 -0.091 10.786 -3.910
41777 44259 65661 -2.176 -0.615 4.667 -2.365
43477 102531 114783 4.115 - 1.748 11.127 5.587

文件B:

43477 102531 114783 4.115 -1.748 11.127 5.587
45777 117537 87933 -0.796 -1.043 5.087 -1.581
48977 88665 56952 -2.188 -0.919 4.310 -2.523
41777 50955 84639 -4.310 -0.091 10.786 -3.910
49577 69957 97128 -1.940 -1.209 4.153 -1.680
41777 44259 65661 -2.176 -0.615 4.667 -2.365
47977 98640 88665 -1.894 -0.800 4.032 -2.315
41777 44259 65661 -2.176 -0.615 4.667 -2.365

我想获得类似,

FINAL:

45777 117537 87933 -0.796 -1.043 5.087 -1.581
48977 88665 56952 -2.188 -0.919 4.310 -2.523
49577 69957 97128 -1.940 -1.209 4.153 -1.680
47977 98640 88665 -1.894 -0.800 4.032 -2.315

仅打印包含在FILE B中与FILE A不同的行,并且如果有重复行,则仅使用bash脚本打印其中的一行。

谢谢

+0

我建议您搜索这个,有无数的“打印两个文件之间的差异”和“打印每行的第一次出现”的例子。 –

+1

我认为这个例子是不正确的:例如,文件A和B中的第一行是相同的,但不是输出的一部分,即使你问“......如果有重复的行,只打印它们中的一个.. 。“ 无论如何,你可以检查[这个答案](https://unix.stackexchange.com/questions/11343/linux-tools-to-treat-files-as-sets-and-perform-set-operations-on他们),你会发现你在找什么。 – bubbakk

这里是你想要的东西:

#!/bin/bash 

declare -A hash_a hash_b 
IFS="\n" 

while read line; do 
    hash_a[$line]=1 
done < File_A 

while read line; do 
    hash_b[$line]=1 
done < File_B 

for i in ${!hash_b[@]}; do 
    if [ -z "${hash_a[$i]}" ]; then 
     echo $i 
    fi 
done 

的技巧是一个关联数组使用整行作为一个键自动整合到相同的行。

+0

非常感谢@tshiono –