grep -f input.txt reading.txt > output.txt
... напечатает все строки в 'read.txt' с подстрокой, соответствующей строке в 'input.txt', в порядке файла 'reading.txt', в 'output.txt'
Вы не указываете это, но это может иметь значение (вы сказали строки 1,2 МБ в 'read.txt') - отдельный выходной файл для каждой совпадающей строки:
#!/bin/sh
nl='
'
IFS=$nl
c=0
for i in $(grep -f input.txt reading.txt); do
c=$((c+1))
echo "$i" > output$c.txt
done
Там есть более аккуратные методы установки IFS на новую строку, например, в bash
: IFS=$'\n'
(также вы можете использовать > output$((++c)).txt
в bash)