Попытка объединить 2 файла, но игнорировать новые строки - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь объединить 2 списка вместе: копировать только общие различия, но игнорировать новые строки. Возможно, будет проще объяснить это:

a.txt                 b.txt
abc                   123 
def                   abc.^$234,~12
ghi                   abcdd
jkl                   asdf
mnn                   ghi.^$321,~11
opq                   jkl
                      mnn^$qws
                      zxy

Становится:

output.txt:
abc.^$234,~12
def
ghi.^$321,~11
jkl
mnn^$qws
opq

Попытка объединить в списки, скопировать общие строки, отбрасывая новые строки.

Ответы [ 4 ]

1 голос
/ 11 июля 2020

Это может сработать для вас (GNU sed):

sed -nE '1{x;s/.*/cat file2/e;x};G;s/^([^\n]+)(\n.*)*\n(\1\>[^\n]*).*/\3/;P' file1

Slurp file2 в удерживаемое пространство и затем добавьте его в каждую строку в file1.

Если слово в file1 совпадает слово в файле2, распечатайте содержимое этой строки в файле2. В противном случае вывести текущую строку в file1.

0 голосов
/ 11 июля 2020

Ваши требования не совсем ясны, но это даст ожидаемый результат, который вы опубликовали, с учетом образца ввода, который вы опубликовали, поэтому это может быть то, что вы ищете:

$ awk -F'[^[:alnum:]]' 'NR==FNR{a[$1]=$0; next} {print ($1 in a ? a[$1] : $1)}' b.txt a.txt
abc.^$234,~12
def
ghi.^$321,~11
jkl
mnn^$qws
opq
0 голосов
/ 11 июля 2020

Использование awk:

$ awk '
NR==FNR {
    a[$0]
    next
}
{
    for(i in a)
        if(index(i,$0)) {
            print i
            next
        }
    print
}' b a

Вывод:

abc.^$234,~12
def
ghi.^$321,~11
jkl
mnn^$qws
opq
0 голосов
/ 11 июля 2020

вы можете попробовать команды diff и patch, они могут вам помочь.

diff -u old_file new_file > change.diff
patch new_file < change.diff 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...