O formato do arquivo é provavelmente o UTF-16 little-endian. Alguns aplicativos no Windows parecem padrão para isso e causam muitos problemas de porabilidade.
vi representa bytes valorizados ASCII-Nul (numericamente zero) como '^ @' (control-At). Você pode inserir bytes com valor zero em vim com o acorde control-shift- @.
grep deve ver os bytes NII ACII, em vez de interpretar o arquivo como UTF-16 e, em seguida, ver os pontos de código Unicode para '2' ou '0' ou o que for. Eu não vejo uma opção na página GNU grep man para fazer com que ele lide com UTF - qualquer coisa.
cat não mostra os bits ASCII-Nul, o emulador de terminal em questão os mostraria, mas qualquer que seja o emulador de terminal que você esteja usando, estará ignorando-os. Se você usar cat cl.txt | od -x ou melhor, cat cl.txt | xxd , verá os bytes ASCII-Nul na saída de cat . Se você vir algo como 'ffef' ou 'efff' como os dois primeiros bytes do arquivo, eles são o "byte order mark" promulgado pela Microsoft contra todo o senso comum.
Não tenho certeza do que recomendar para transliterar UTF-16 para ASCII ou UTF-8, iconv maybe, mas nunca usei isso.