-1

I have a text file that I would like to edit and therefore would like to remove the last line. I have the following code for this:

for /f "delims=" %%a in (input.txt) do (
echo/|set /p ="%%a%"
)>>output.txt

input:

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

output:

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

Now I would like to edit the data in groups for example by the first value, so that I have the following output:

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
Julius
  • 17
  • 3

2 Answers2

0

If I replace the FOR /F "delims=" %%a in (input.txt) do … loop with an equivalent FOR %%a in … loop:

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
set "_gruppeName="
(
  for %%a in (
    "GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
  ) do (
    for /f "tokens=1 delims=;" %%A in ("%%~a") do (
      if /I NOT "%%~A"=="!_gruppeName!" (
        if defined _gruppeName echo(
        set "_gruppeName=%%~A"
      )
    ) 
    echo/|set /p ="%%~a"
  )
  echo(
)>>output.txt
REM debugging output follows
type output.txt

Output:

1st run: 2>NUL del output.txt & D:\bat\CR\61816520.bat

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

Next run: D:\bat\CR\61816520.bat

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
JosefZ
  • 28,460
  • 5
  • 44
  • 83
0

Your question is not clear

based on ... the first value (GRUPPEA)

is it SORTed? or just write duplicates on the same line?

@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion

::VARIABLES
set "in=input.txt" IN file
set "out=output.txt" OUT file

set/a"#lines=0"
set "gruppe="
set "prevContent="

::Count lines
FOR /F %%L in ('
"findstr /N "^^" "%in%" %= do not skip empty lines =%"
') do set/a"#lines+=1" %= Get the # of lines =%


::Read IN via SET /P #LINES number of times
::Bangs (!) will be lost
<"%in%" >"%out%" (FOR /L %%# in (1 1 %#lines%) do (
    set "data="                           ::clear DATA
    set/p"data="                          ::read from IN
    FOR /F tokens^=1^ delims^=^;^ eol^= %%T in ("!data!") do set "gruppe=%%T"
    if NOT "!prevContent!" == "!gruppe!" (
        set "prevContent=!gruppe!"
        echo(
    )
    <nul set/p"=!data!"                    ::does not work with leading space, tabs, or equal signs
)) %= read file by lines via SET /P =%

exit /b

The script counts the number of lines using FINDSTR /N and a FOR /F loop to count the # of lines, which is required to execute SET /P that many times.

Tips:

  • Use ECHO( instead of the problematic ECHO.
  • Using a pipe | is very slow, as described by @jeb here. Use <nul instead
ScriptKidd
  • 803
  • 1
  • 5
  • 19