Предположим, что оба файла отсортированы по полю соединения:
$ join -1 3 -a 2 -o1.1,1.3,1.3 file1 file2
BMW N1 N1
TOYOTA N3 N3
Это выполняет реляционную операцию JOIN для двух файлов, используя третий столбецfile1
(с-1 3
)и первый и единственный столбец file2
. Мы просим, чтобы все строки file2
были включены в вывод (с -a 2
), даже непарные строки. Для вывода просим вывести все три поля первого файла (с флагом -o
). Пустые поля в непарных строках останутся пустыми, но можно добавить -e something
, чтобы заполнить их строкой something
.
Если два файла не отсортированы по полю соединения, вы можете предварительно -отсортировать их, используя
sort -k3 -o file1 file1
sort -o file2 file2
или вы можете выполнить сортировку одновременно с соединением, если ваша оболочка поддерживает подстановку процессов, с помощью
join -1 3 -a 2 -o1.1,1.3,1.3 \
<( sort -k3 file1 ) \
<( sort file2 )
Так как это скрипт bash
(, несмотря на .sh
расширение ), вы всегда можете выполнить (внутриbash
):
uname()
if [ "$#" -eq 1 ] && [ "$1" = -m ]; then
echo arm64
else
command uname "$@"
fi
export -f uname
gclone.sh
То есть замените uname
на экспортированную функцию, которая выводит то, что вы хотите, при передаче аргумента -m
.