我有两个文件,越小越大,包含更小的所有行。这些行几乎相同,只是最后一列不同。
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
你可以帮我这么做吗?非常感谢。
答案 0 :(得分:2)
您可以执行以下操作:
cat file_bigger file_smaller |sed 's=\(.*\).$=\1='|sort| uniq -u > temp_pat
grep -f temp_pat file_bigger ; rm temp_pat
将(以相同的顺序)
总而言之,预期的结果。
答案 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