Resposta separada porque esta é, essencialmente, uma solução diferente
Então, aqui está uma versão cmd / batch.
@echo off
type NUL>output.txt
for /f "tokens=1,3 delims=, skip=1" %%a in (input.txt) do (
if "%%b"=="" goto :eof
findstr "^%%b$" output.txt > NUL
if ERRORLEVEL 1 echo %%b>>output.txt
)
Ele cria o arquivo output.txt e, em seguida, lê o arquivo input.txt usando for
e ,
como um delimitador. A primeira linha é pulada.
O primeiro token ( tokens=1,3
) precisava ser lido para interrompê-lo na linha some message
, já que ele ignoraria a linha e continuaria se o token solicitado ( tokens=3
) não existisse - e nunca execute o if
. %%a
é o primeiro token solicitado ( 1
), %%b
é o segundo ( 3
).
a71,a72,a73,a74
a71,a72,keyC,a74
some message
a71,a72,keyD,a74
keyD
não será lido, pois ele pára na linha anterior (não possui um terceiro token). No entanto, a73
será contado.
Isso usa findstr
no arquivo de saída para verificar se a chave já está lá - não é eficiente, mas funciona. O RegEx é usado para garantir que corresponda à linha inteira; se uma chave estiver contida inteiramente dentro da outra chave, ela não corresponderá (ou seja, keyA
não corresponderá a key
). A saída é canalizada para NUL
para manter as coisas quietas.
E se a chave não estiver no arquivo de saída, ela será anexada.