Yes, it behaves just like you expect, where a read with >40% Ns but only at the ends will still be kept (after trimming).
Cutadapt runs in two stages, with read modification first and read filtering after. So first, --trim-n
removes Ns at the start and end of reads are removed, and only then is a rule like --max-n
applied.
Here's an example where the first 5 sequences have Ns at the ends and the next 5 have Ns interspersed:
>seq01 0%
CACATCAAGAGGTCCTTGGCGACTATTAGCGCCCGGCGGACCCAATCGTA
>seq02 20%
NNNNNCAAGAGGTCCTTGGCGACTATTAGCGCCCGGCGGACCCAANNNNN
>seq03 40%
NNNNNNNNNNGGTCCTTGGCGACTATTAGCGCCCGGCGGANNNNNNNNNN
>seq04 60%
NNNNNNNNNNNNNNNTTGGCGACTATTAGCGCCCGNNNNNNNNNNNNNNN
>seq05 80%
NNNNNNNNNNNNNNNNNNNNGACTATTAGCNNNNNNNNNNNNNNNNNNNN
>seq06 10%
CACATCANGAGGTCCTTNGCGACTATTNGCGCCCGGCNGACCCAATCNTA
>seq07 20%
CANATCANGAGGNCCTTNGCGANTATTNGCGCNCGGCNGACCNAATCNTA
>seq08 40%
CNNATCNNGAGNNCCTNNGCGNNTATNNGCGNNCGGNNGACNNAATNNTA
>seq09 60%
CNNANCNNGNGNNCNTNNGNGNNTNTNNGNGNNCNGNNGNCNNANTNNNA
>seq10 80%
CNNNNNNNGNNNNCNNNNGNNNNTNNNNGNNNNCNNNNGNNNNANNNNNA
With just read filtering:
$ cutadapt --quiet --max-n 0.4 seqs.fa -o -
>seq01 0%
CACATCAAGAGGTCCTTGGCGACTATTAGCGCCCGGCGGACCCAATCGTA
>seq02 20%
NNNNNCAAGAGGTCCTTGGCGACTATTAGCGCCCGGCGGACCCAANNNNN
>seq03 40%
NNNNNNNNNNGGTCCTTGGCGACTATTAGCGCCCGGCGGANNNNNNNNNN
>seq06 10%
CACATCANGAGGTCCTTNGCGACTATTNGCGCCCGGCNGACCCAATCNTA
>seq07 20%
CANATCANGAGGNCCTTNGCGANTATTNGCGCNCGGCNGACCNAATCNTA
>seq08 40%
CNNATCNNGAGNNCCTNNGCGNNTATNNGCGNNCGGNNGACNNAATNNTA
With trimming also:
$ cutadapt --quiet --max-n 0.4 --trim-n seqs.fa -o -
>seq01 0%
CACATCAAGAGGTCCTTGGCGACTATTAGCGCCCGGCGGACCCAATCGTA
>seq02 20%
CAAGAGGTCCTTGGCGACTATTAGCGCCCGGCGGACCCAA
>seq03 40%
GGTCCTTGGCGACTATTAGCGCCCGGCGGA
>seq04 60%
TTGGCGACTATTAGCGCCCG
>seq05 80%
GACTATTAGC
>seq06 10%
CACATCANGAGGTCCTTNGCGACTATTNGCGCCCGGCNGACCCAATCNTA
>seq07 20%
CANATCANGAGGNCCTTNGCGANTATTNGCGCNCGGCNGACCNAATCNTA
>seq08 40%
CNNATCNNGAGNNCCTNNGCGNNTATNNGCGNNCGGNNGACNNAATNNTA