Я пытаюсь сравнить два файла так, чтобы во втором файле были допустимы строки, которые начинаются с строк в первом файле (но с добавленным нежелательным мусором).
Рассмотрим следующий код:
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 заканчивается пустым, хотя я вручную искал два подходящих номера.