| #!/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 <https://www.gnu.org/licenses/>. |
| |
| # 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 <mail@bernhard-voelker.de>. |
| 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 |