Return previous line with Findstr - windows

I am running FINDSTR command to find specific text in .txt files. I want to print matching lines as well as 1 previous line.
findstr "ActualStartDate:" * > a.txt
if my file is like this
abcd
defg
cds
ActualStartDate: invalid date
Result should be like this
cds
ActualStartDate: invalid date

try this with grep for Windows:
grep -1 "ActualStartDate:" *.txt
output is eg.:
file.txt-cds
file.txt:ActualStartDate: invalid date

There is a tool written as a batch file that can do this easily, which uses built in Windows scripting.
findrepl.bat - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

Related

Renaming filename before first occurrence of character

I'm trying to rename a batch of files using a bash script or just in the command line but can't seem to find anything on how to remove characters before the first occurrence of a character.
Right now my files are named:
author1_-_year_-_title_name.txt
author2_-_year_-_title_name.txt
And I want them to look like
_-_year_-_title_name.text
or even
year_-_title_name.text
I've tried sed in the command line:
sed 's/^[^_-_]* _-_ //' *
but this only tried to edit the text files, not the file name
You can't change filenames using sed. Try this simple loop instead:
for fp in ./*_-_*; do
echo mv "$fp" "${fp#*_-_}"
done
If the output looks good, remove echo.
Could you please try rename command as follows.
rename -n s/[^-]*-_// *.txt
Output will be as follows.
rename(author1_-_year_-_title_name.txt, year_-_title_name.txt)
rename(author2_-_year_-_title_name.txt, year_-_title_name.txt)
Once you are Happy with above results(which will print only on terminal) remove -n option in above command and it should rename the files.

to compare two text files and output the difference in other file .txt

I want to compare two text files and output the difference in other result.txt.
I use this command in command prompt:
findstr /vixg:Z:\misc\test1.txt Z:\misc\misc\test2.txt > Z:\misc\misc\result.txt
But I have the file result.txt is the same of test2.txt.

Grep for windows

Old.txt contains
apple
orange
banana
And New.txt contains
apple
orange
banana
grape
lemon
I can access new contents which are added to New.txt using grep command.
grep -Fxvf Old.txt New.txt > difference.txt
Now, difference.txt contains
grape
lemon
In Windows, I have tried
findstr /rvc:Old.txt New.txt > difference.txt
to find the difference but it append contents of Old.txt too. How can I write equivalent command in Windows?
You can use DOS findstr with the following flags:-
/v : Prints only lines that do not contain a match.
/g: file : Gets search strings from the specified file.
The command would be something like:-
C:\Users\dude\Desktop>findstr /v /g:Old.txt New.txt >difference.txt
Now checking the file output using the type command; equivalent to cat in Linux, we see :-
C:\Users\dude\Desktop>type difference.txt
grape
lemon
Unless you are restricted from installing anything on your PC, considering installing ports of *nix-like tools such as GnuWin32 and continue to use grep.

Rename one file with the first line of the file's contents (not batch)

I've searched a ton and found this answer for batch processing, but I'm looking for a simple answer that I can hopefully just enter on the command line, for changing the name of 1 file and replacing the name with the contents of the file's first line.
For file foo.txt
With the first line of the file's contents: 123
Rename foo.txt as 123.txt
Much thanks!
mv fileName $(head -1 fileName).txt
head -1 fileName will retrieve the first line of a file, placing it inside of $() allows that code to execute and the result (the first line of the file) will become the second parameter of the mv command.
In your example, you are looking at:
mv foo.txt $(head -1 foo.txt).txt

Concatenate text files with Windows command line, dropping leading lines

I need to concatenate some relatively large text files, and would prefer to do this via the command line. Unfortunately I only have Windows, and cannot install new software.
type file1.txt file2.txt > out.txt
allows me to almost get what I want, but I don't want the 1st line of file2.txt to be included in out.txt.
I have noticed that more has the +n option to specify a starting line, but I haven't managed to combine these to get the result I want. I'm aware that this may not be possible in Windows, and I can always edit out.txt by hand to get rid of the line, but is there a simple way of doing it from the command line?
more +2 file2.txt > temp
type temp file1.txt > out.txt
or you can use copy. See copy /? for more.
copy /b temp+file1.txt out.txt
I use this, and it works well for me:
TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv
Of course, before every run, you have to DELETE C:\Folder\ConcatenatedFile.csv
The only issue is that if all files have headers, then it will be repeated in all files.
I don't have enough reputation points to comment on the recommendation to use *.csv >> ConcatenatedFile.csv, but I can add a warning:
If you create ConcatenatedFile.csv file in the same directory that you are using for concatenation it will be added to itself.
Use the FOR command to echo a file line by line, and with the 'skip' option to miss a number of starting lines...
FOR /F "skip=1" %i in (file2.txt) do #echo %i
You could redirect the output of a batch file, containing something like...
FOR /F %%i in (file1.txt) do #echo %%i
FOR /F "skip=1" %%i in (file2.txt) do #echo %%i
Note the double % when a FOR variable is used within a batch file.
I would put this in a comment to ghostdog74, except my rep is too low, so here goes.
more +2 file2.txt > temp
This code will actually ignore rows 1 and 2 of the file. OP wants to keep all rows from the first file (to maintain the header row), and then exclude the first row (presumably the same header row) on the second file, so to exclude only the header row OP should use more +1.
type temp file1.txt > out.txt
It is unclear what order results from this code. Is temp appended to file1.txt (as desired), or is file1.txt appended to temp (undesired as the header row would be buried in the middle of the resulting file).
In addition, these operations take a REALLY LONG TIME with large files (e.g. 300MB)
Here's how to do this:
(type file1.txt && more +1 file2.txt) > out.txt
In powershell:
Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
I know you said that you couldn't install any software, but I'm not sure how tight that restriction is. Anyway, I had the same issue (trying to concatenate two files with presumably the same headers) and I thought I'd provide an alternative answer for others who arrive at this page, since it worked just great for me.
After trying a whole bunch of commands in windows and being severely frustrated, and also trying all sorts of graphical editors that promised to be able to open large files, but then couldn't, I finally got back to my Linux roots and opened my Cygwin prompt. Two commands:
cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv
For file1.csv 800MB and file2.csv 400MB, those two commands took under 5 seconds on my machine. In a Cygwin prompt, no less. I thought Linux commands were supposed to be slow in Cygwin but that approach took far less effort and was way easier than any windows approach I could find.
You can also simply try this
type file2.txt >> file1.txt
It will append the content of file2.txt at the end of file1.txt
If you need original file1.txt, take a backup beforehand. Or you can do this
type file1.txt > out.txt
type file2.txt >> out.txt
If you want to have a line break at the end of the first file, you can try the following command before appending.
type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt
The help for copy explains that wildcards can be used to concatenate multiple files into one.
For example, to copy all .txt files in the current folder that start with "abc" into a single file named xyz.txt:
copy abc*.txt xyz.txt
more +2 file1.txt > type > out.txt && type file2.txt > out.txt
This takes Test.txt with headers and appends Test1.txt and Test2.txt and writes results to Testresult.txt file after stripping headers from second and third files respectively:
type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt

Resources