Нашел. Это задокументировано в нижней части экрана настроек. Ctrl+F9
Следующий скрипт bash должен выполнять эту работу (, начиная с bash 4 или выше):
#!/bin/bash
readarray -t a_arr < a.txt
readarray -t b_arr < b.txt
for a_el in "${a_arr[@]}"
do
# remove the first two characters 'zn'
substr_a=${a_el:2}
isin=0
for b_el in "${b_arr[@]}"
do
# extract matches from b.txt file
substr_b=$(echo $b_el | sed -n "s#^\(.*\)\/[[:digit:]]\+#\1#p")
if [ "$substr_a" == "$substr_b" ];then isin=1; break;fi
done
if [ $isin -eq 0 ];then echo $substr_a ;fi
done > final.txt
Если вы используете версию bash ниже 4, вы должны заменить строки readarray
на эти:
a_arr=($(<a.txt))
b_arr=($(<b.txt))
Такой уродливый онлайнер
sdiff -s <(sed 's/^zn//' a.txt|sort) <(awk -F/ '{ print $1 }' b.txt| sort) | awk -F'[<|>]' '{ print $1 }'
#1 #2 #3 #4
сделает свою работу.
Пояснение:
#1 sdiff
сравнивает 2 текстовых файла построчно, -опция s подавляет общие строки
#2 sed
Удаляет префикс zn с начала каждой строки файла a.txt
#3 awk
указано выводить только левую до /
часть каждой строки в файле b.txt
#4 другому awk приказано выводить только часть строки слева от<
|
или >
char. Эти символы являются разделителями в выводе sdiff
.
<(somecommand)
идиома, также известная как замена процесса рассматривается как имя файла с содержимым, созданным в результате выполнения какой-либо команды
| sort
очевидно, сортирует выходные данные для предоставления sdiff
отсортированных файлов
Если у вас есть GNU awk
(, который реализует BEGINFILE
), вы можете....
awk 'BEGINFILE{FS=(NR!=0)?"^..":"/"}
NR==FNR{test[$1]=1; next}
!($2 in test){print $2}' b.txt a.txt
418l
Если вы хотите выполнить обратную запись в a.txt
вместо перенаправления в новый файл > final.txt
, вы можете добавить
| sponge a.txt
Прохождение
awk 'BEGINFILE{FS=(NR!=0)?"^..":"/"}
При открытии первого файла выполняется BEGINFILE
и NR==0
, поэтомуFS=/
NR==FNR{test[$1]=1; next}
Перебрать первый файл NR==FNR
загрузить $1
в тестовый массив
При открытии второго файла BEGINFILE
выполняется снова, но теперь NR!=0
поэтому FS=^..
удаляет все после первых двух символов входной строки в$2
!($2 in test){print $2}' b.txt a.txt
Перебрать второй файл и print $2
, если его нет в тестовом массиве !($2 in test)
.
$ awk -F'/' 'NR==FNR{b[$1]; next} {sub(/^zn/,"")} !($1 in b)' b.txt a.txt
4i8l