忽略最后一列时两个文件中的不同行 - 在bash中

时间:2012-04-17 12:04:23

标签: bash comparison diff

我有两个文件,越小越大,包含更小的所有行。这些行几乎相同,只是最后一列不同。

file_smaller
  A NM 0
  B GT 4

file_bigger
  A NM 5 <-same as in file_smaller according to my rules
  C TY 2
  D OP 6
  B GT 3 <-same as in file_smaller according to my rules

我想写两行文件不同的行,这意味着:

wished_output
  C TY 2
  D OP 6
你可以帮我这么做吗?非常感谢。

4 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

cat file_bigger file_smaller |sed 's=\(.*\).$=\1='|sort| uniq -u > temp_pat
grep -f temp_pat file_bigger ; rm temp_pat

将(以相同的顺序)

  • 合并文件
  • 删除最后一列
  • 对结果进行排序
  • 仅打印temp_pat
  • 中的唯一行
  • 在file_bigger中找到原始行

总而言之,预期的结果。

答案 1 :(得分:1)

awk 'FILENAME==file_bigger {arr[$1 $2]=$0}
     FILENAME==file_smaller { tmp=$1 $2;  if( tmp in arr) {next} else {print $0}}
    ' file_bigger file_smaller

看看是否满足您的需求

答案 2 :(得分:1)

grep -vf <(cut -d " " -f 1-2 file_smaller| sed 's/^/^/') file_bigger

流程替换导致:

^A NM
^B GT

然后,grep -v从“file_bigger”

中删除这些模式

答案 3 :(得分:0)

使用关联数组Bash 4:

#!/usr/bin/env bash

f() {
    if (( $# != 2 )); then
        echo "usage: ${FUNCNAME} <smaller> <bigger>" >&2
        return 1
    fi

    local -A smaller
    local -a x

    while read -ra x; do
        smaller["${x[@]::2}"]=0
    done <"$1"

    while read -ra x; do
        ((${smaller["${x[@]::2}"]:-1})) && echo "${x[*]}"
    done <"$2"
}

f /dev/fd/3 /dev/fd/0 <<"SMALLER" 3<&0 <<"BIGGER"
A NM 0
B GT 4
SMALLER
A NM 5
C TY 2
D OP 6
B GT 3
BIGGER