#!/bin/sh # join-v-1 - Filter out a set of items from another set of items. # Copyright (C) 2021 Free Software Foundation, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Usage: join-v-1 FILE1 FILE2 # Produces on stdout a list of items that are contained in FILE1 but not # contained in FILE2. The items are strings without whitespace. # FILE1 and FILE2 contain such items, one per line, sorted according to # the current locale. # FILE1 or FILE2 can be specified as '-', which denotes standard input. # The 'join' program does not exist on all platforms. Where it exists, # we can use it. if (type join) >/dev/null 2>&1; then join -v 1 "$1" "$2" else # Two solutions based on awk, by Bernhard Voelker . if true; then awk -v keyfile="$2" ' BEGIN { while ((getline < keyfile) > 0) k[$1]=1 } !k[$1] ' "$1" else awk ' keys { k[$1]=1; next } !k[$1] ' keys=1 "$2" keys=0 "$1" fi fi