Поиск общих / непересекающихся строк между двумя файлами, включая строки в файле B, которые начинаются со строк из файла A - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь сравнить два файла так, чтобы во втором файле были допустимы строки, которые начинаются с строк в первом файле (но с добавленным нежелательным мусором).

Рассмотрим следующий код:

printf '%s\n' 5234 2234 3234 4234 1234 >NumsOnFile.txt
printf '%s\n' 423499 1234 223401 3234 >UserNums.txt

Я хочу создать два выходных файла: good.txt с числами, найденными в обоих файлах (даже просто как подстрока), и bad.txt с числами, существовавшими в UserNums.txt но не в NumsOnFile.txt.


Существующая попытка реализации

Этап 1: устранение уже правильных строк

В настоящее время я делаю это в два этапа,Моя текущая попытка на первом этапе выглядит следующим образом:

sort -n UserNums.txt > a 
sort -n NumsOnFile.txt > b
awk '!a[$0]++' a > A
awk '!a[$0]++' b > B
comm -23 A B > bad.txt  
comm -12 A B > good.txt  

Я ожидаю, что good.txt будет содержать следующее:

1234
3234

... и bad.txt, чтобы содержатьследующее:

423499
223401

Этап 2: пытаюсь найти подстроки

Затем я обрабатываю bad.txt, проверяя, найдены ли совпадения после того, как последний символ каждой строкиудалено:

read file
if [ -s bad.txt ]
   then 
    sed 's/.$//' bad.txt > checker.txt # removes last character from each line
    sort -n checker.txt > X
    comm -23 X B > checker.txt 
    comm -12 X B >> good.txt
    cat checker.txt > bad.txt 
else
    echo "File is empty"
fi 

После этого второго этапа, good.txt теперь должен иметь все числа, соответствующие обоим файлам (даже если они были только подстрокой в ​​UserNums.txt):

1234
2234
3234
4234

... тогда как bad.txt должны иметь исходные числа, которые не совпадают:

423499
223401       

Что здесь не так?

Я думаю, что моя логика звучит здраво, ноне использовать правильные команды или команды, используемые неправильно.Но if может быть чем-то увлечен.

  • Файлы bad.txt и good.txt не заполняются нужными данными.Числа из обоих файлов заканчиваются в обоих или некоторые числа отсутствуют все вместе.
  • good.txt заканчивается пустым, хотя я вручную искал два подходящих номера.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы можете сделать вывод с этими командами

cat NumsOnFile.txt UserNums.txt | cut -c1-4 |sort | uniq -d > good.txt
grep -vFxf NumsOnFile.txt UserNums.txt > bad.txt
0 голосов
/ 09 октября 2018

Если я правильно понимаю вашу проблему, то, возможно, это должно сработать

#!/bin/bash

# All files are assumed to be in the same directory. Please modify the paths if necessary.

# Opening files for writing

exec 3>./Bad.txt
exec 4>./Good.txt
exec 5>./correction.sed

#Creating an array for the account numbers.
while read line; do
    accountNumber[$line]=$line
done < ./NumsOnFile.txt

# Comparing the user's file with your account file
while read line; do
    # That takes only the first 4 characters. If your account number are of a different length please modify
    accUser=${line:0:4}
    if [[ ${accountNumber[$accUser]} -ne $line ]]; then
        #if different then write the bad file and the script to correct the original file
        echo $line >&3
        echo "s|$line|$accUser|g" >&5
    else
        #if same, just write the good file
        echo $line >&4
    fi
done < ./UserNums.txt

# Closing files

exec 3>&-
exec 4>&-
exec 5>&-

# Executing sed script to correct the input file

sed -i.bck --file=./correction.sed ./UserNums.txt

Надеюсь, что это может помочь.

Редактировать

Отредактировано, чтобы принять комментарии Чарльза всчет

...