1

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

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

4 回答 4

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 中找到原始行

总而言之,预期的结果。

于 2012-04-17T12:23:16.270 回答
1
grep -vf <(cut -d " " -f 1-2 file_smaller| sed 's/^/^/') file_bigger

进程替换导致:

^A NM
^B GT

然后,grep -v从“file_bigger”中删除这些模式

于 2012-04-17T14:50:37.173 回答
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

看看能不能满足你的需求

于 2012-04-17T12:31:36.470 回答
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
于 2012-04-17T12:45:42.480 回答