Aqui está o comando Nmap mais básico e eficiente para fazer o que você quer (e nada mais):
#!/bin/sh
# Gather the IPs to scan for each port
perl -lanF\; -e'push @{$p{$F[1]}}, $F[0];END{$,=" ";while(($x,$y)=each%p){print $x,@$y}}' input.txt | while read port ips; do
# Scan the appropriate port for each set of IPs
nmap -Pn -n -oG - -p $port $ips |\
# Put the open ones into open.txt and the closed/filtered into closed.txt
awk 'OFS=":";$4~/^Ports:/{if(/open/){print $2,'$port' >> "open.txt"}else{print $2,'$port' >> "closed.txt"}}'
done
Infelizmente, o Nmap não tem uma maneira interna de varrer apenas algumas portas em alguns IPs e outras portas em outros IPs, caso contrário, isso pode ser muito mais simples.