Сравните два файла и создайте другой при совпадении условий

Нашел. Это задокументировано в нижней части экрана настроек. Ctrl+F9

-1
11.07.2020, 23:59
4 ответа

Следующий скрипт 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))
1
18.03.2021, 23:20

Такой уродливый онлайнер

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отсортированных файлов

0
18.03.2021, 23:20

Если у вас есть 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).

0
18.03.2021, 23:20
$ awk -F'/' 'NR==FNR{b[$1]; next} {sub(/^zn/,"")} !($1 in b)' b.txt a.txt
4i8l
2
18.03.2021, 23:20

Теги

Похожие вопросы