Как проверить, существует ли подстрока из каждой строки File1 в File2 - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть два файла со следующими данными

file1:

6100540301SD01        ON5330399520191104906781            2019110390678151053303995ACK          20191105
6100540301SD01        ON0403096420191104225695            2019110322569551004030964A            20191105
6005260301SD01        46460045792019110490678911059455    2019110490678951000755694BE3        1120191105
6005260301SD01        46460045792019110490679616020577    2019110490679651000764053BDJDEDH    1620191105

file2:

20191104
20191105
20191106

Поскольку file1 является файлом фиксированной ширины, строка в позиции от 97 до 104 является датой. Я хочу извлечь строку по позиции от 97 до 104 и проверить, существует ли она в file2 . Если он существует, я хочу скопировать всю строку в file3 . Если его нет, я хочу скопировать его в file4 .

Я создал программу на C ++, но онаобработка file1 занимает много времени, в то время как это почти полмиллиона записей. Поэтому, если есть какой-либо скрипт awk/sed, который может быть полезен, пожалуйста, поделитесь.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

awk на помощь!

$ awk 'NR==FNR {dates[$0]; next} 
               {print > (substr($0,97,104) in dates?"file3":"file4")}' file2 file1
0 голосов
/ 08 ноября 2019

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

sed 's#.*#/^.\\{96\\}&/ba#' file2 | sed -nf - -e 'w file4' -e 'b;:a;w file3' file1

Создать скрипт из файла2, который записывает каждое совпадение в файл3 и любые оставшиеся строки в файл4.

Первый вызовsed передает свой вывод второму вызову sed, который, в свою очередь, дополняется парой строк встроенных команд. Все совпадения отправляются держателю цикла :a, который записывает их в файл3, если они не сопоставлены, и записываются в файл4.

0 голосов
/ 08 ноября 2019

Превратите содержимое file2 в регулярное выражение типа 20191104|20191106|20191106. Затем вы можете использовать grep для сопоставления.

patterns=$(<file2)
# Replace newlines with |
pattern=${patterns//$'\n'/|}
# Put ^.{96} at the beginning so it matches starting at column 97
pattern="^.{96}($pattern)"
grep -E "$pattern" file1 > file3 # Lines that match
grep -v -E "$pattern" file1 > file4 # Lines that don't match

Если запуск grep дважды слишком медленный, вы можете использовать awk:

awk -v pat="$pattern" '$0 ~ pat { print >>"file3"; next} {print >>"file4"}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...