"How to get an exact string from a txt file?"


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting "How to get an exact string from a txt file?"
# 1  
"How to get an exact string from a txt file?"

I have many Gaussian output files, which contain a string start from "HF=" but follws the different values. I'm trying to get this exact string from these txt files.

example 1,
Code:
 2.524075,-0.563322,-1.285286\H,0,-2.544438,-0.678834,1.199166\H,0,2.18
 5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1
 557592\S2=6.033269\S2-1=0.\S2A=6.000179\RMSD=8.037e-05\Thermal=0.\Dipo
 le=-0.1643425,0.9094768,0.0321427\PG=C01 [X(C4H9Cr1O1)]\\@

example 2,
Code:
 6256\H,0,-2.980236,0.00009,-0.45647\\Version=EM64T-G03RevE.01\State=5-
 A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The
 rmal=0.\Dipole=0.8534315,0.002042,-0.5745813\PG=C01 [X(C2H5Cr1O1)]\\@

how to get "HF=-1277.1557592"( this value in one line or two lines) and put this value into a new file?

If you have a good suggestion, please help me!
Thanks!

Last edited by Franklin52; 10-19-2009 at 01:28 PM.. Reason: Please use code tags!!
# 2  
Quote:
Originally Posted by liuzhencc
...
I'm trying to get this exact string from these txt files.

example 1,
2.524075,-0.563322,-1.285286\H,0,-2.544438,-0.678834,1.199166\H,0,2.18
5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1
557592
\S2=6.033269\S2-1=0.\S2A=6.000179\RMSD=8.037e-05\Thermal=0.\Dipo
le=-0.1643425,0.9094768,0.0321427\PG=C01 [X(C4H9Cr1O1)]\\@

example 2,
6256\H,0,-2.980236,0.00009,-0.45647\\Version=EM64T-G03RevE.01\State=5-
A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The
rmal=0.\Dipole=0.8534315,0.002042,-0.5745813\PG=C01 [X(C2H5Cr1O1)]\\@

...
If "example 1" and "example 2" are examples of a single lines (i.e. they do not span multiple lines in your text file), then here's a way to do it with Perl:

Code:
$
$ cat -n f1
     1  2.524075,-0.563322,-1.285286\H,0,-2.544438,-0.678834,1.199166\H,0,2.185962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1557592\S2=6.033269\S2-1=0.\S2A=6.000179\RMSD=8.037e-05\Thermal=0.\Dipole=-0.1643425,0.9094768,0.0321427\PG=C01 [X(C4H9Cr1O1)]\\@
     2  6256\H,0,-2.980236,0.00009,-0.45647\\Version=EM64T-G03RevE.01\State=5-A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\Thermal=0.\Dipole=0.8534315,0.002042,-0.5745813\PG=C01 [X(C2H5Cr1O1)]\\@
$
$ perl -lne '/.*(HF=[^\\]+)\\.*/ and print $1' f1
HF=-1277.1557592
HF=-1198.5241253
$
$

You can redirect the output to a new file using the shell's redirection operator.

tyler_durden

##
Sorry, did not read your post carefully.
For the ones that span multiple lines, here's how you can do it with Perl:

Code:
$
$ cat -n f2
     1  example 1,
     2  2.524075,-0.563322,-1.285286\H,0,-2.544438,-0.678834,1.199166\H,0,2.18
     3  5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1
     4  557592\S2=6.033269\S2-1=0.\S2A=6.000179\RMSD=8.037e-05\Thermal=0.\Dipo
     5  le=-0.1643425,0.9094768,0.0321427\PG=C01 [X(C4H9Cr1O1)]\\@
     6  example 2,
     7  6256\H,0,-2.980236,0.00009,-0.45647\\Version=EM64T-G03RevE.01\State=5-
     8  A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The
     9  rmal=0.\Dipole=0.8534315,0.002042,-0.5745813\PG=C01 [X(C2H5Cr1O1)]\\@
$
$ perl -lne 'BEGIN {undef $/} while(/.*(HF=[^\\]+)\\.*/mg){$x=$1; $x=~s/\n//g; print $x}' f2
HF=-1277.1557592
HF=-1198.5241253
$

tyler_durden
# 3  
To tyler_durden, thank you for your kind reply.

This code works very well. Thanks!
the output file like,
Code:
E201GECP.log
HF=-1270.9 206497
E202GECP.log
HF=-1270.91 25011
E301GECP.log
HF=-1349.1118043
E302GECP.log
HF=-1349.1068494
E313GECP.log
HF=-1349.1072849
E401GECP.log
HF=-1427.2934015
E407-2.log
HF=-1427.2920096

the only problem is that there is a space if the original number showed in two lines. how can i fix this problem??
thanks !

Last edited by Franklin52; 10-19-2009 at 01:29 PM.. Reason: Please use code tags!!
# 4  
bash.
Code:
#!/bin/bash
# if your example is one long single line only
var=$(<"file")
IFS='\'
set -- $var
for i in ${var[@]}
do 
    case $i in HF* ) echo $i;; esac
done

# 5  
No, there are in different lines. some values stored in one single line, but some others stored in two lines ( from the end of one line to the beginning of the next line).
# 6  
Quote:
Originally Posted by liuzhencc
...
the only problem is that there is a space if the original number showed in two lines. how can i fix this problem??
...
If there is a space in your output file then it means there is a space in the HF value when it spans multiple lines.

The HF values in my test file were like so:

Code:
$
$ cat f2
example 1,
2.524075,-0.563322,-1.285286\H,0,-2.544438,-0.678834,1.199166\H,0,2.18
5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1
557592\S2=6.033269\S2-1=0.\S2A=6.000179\RMSD=8.037e-05\Thermal=0.\Dipo
le=-0.1643425,0.9094768,0.0321427\PG=C01 [X(C4H9Cr1O1)]\\@
example 2,
6256\H,0,-2.980236,0.00009,-0.45647\\Version=EM64T-G03RevE.01\State=5-
A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The
rmal=0.\Dipole=0.8534315,0.002042,-0.5745813\PG=C01 [X(C2H5Cr1O1)]\\@
$
$
$ # check HF values
$ perl -lne '/HF/ and print "==>|",$_,"|<=="' f2
==>|5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1|<==
==>|A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The|<==
$
$

And your input file probably has this:

Code:
$
$ perl -lne '/HF/ and print "==>|",$_,"|<=="' f2
==>|5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1 |<==
==>|A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The|<==
$
$

Notice how the Perl script, posted earlier, spews incorrect output for such a case:

Code:
$
$ perl -lne 'BEGIN {undef $/} while(/.*(HF=[^\\]+)\\.*/mg){$x=$1; $x=~s/\n//g; print $x}' f2
HF=-1277.1 557592
HF=-1198.5241253
$

That's because I am removing the newline but not the space. The following Perl script assumes that there could be one or more spaces in the HF value, and removes them.

Code:
$
$ # check HF value
$ perl -lne '/HF/ and print "==>|",$_,"|<=="' f2
==>|5962,-1.978001,0.018499\\Version=EM64T-G03RevE.01\State=5-A\HF=-1277.1     |<==
==>|A\HF=-1198.5241253\S2=6.077753\S2-1=0.\S2A=6.000457\RMSD=4.977e-05\The|<==
$
$ # modified Perl script
$ perl -lne 'BEGIN {undef $/} while(/.*(HF=[^\\]+)\\.*/mg){$x=$1; $x=~s/[\n ]//g; print $x}' f2
HF=-1277.1557592
HF=-1198.5241253
$
$

If you think there could be tabs as well, then add "\t" within those square brackets in the s/// operator. Or you could also add "\s" to take care of all whitespaces.

HTH,
tyler_durden
# 7  
Code:
grep -ho 'HF=[^\]*' *.txt > HF.all

Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #818
Difficulty: Medium
In CSS, E > F matches an F element child of an E element.
True or False?

10 More Discussions You Might Find Interesting

1. Programming

[Python] replicating "sha256 -C checksum_file.txt file.txt"

Hello everyone, Since my python knowledge is limimted, I've challenged myself to learn as much as possible to help me with my carrere. I'm currently trying to convert a shell script to python, just to give myself a task. There is one section of the script that I'm having issues converting and... (2 Replies)
Discussion started by: da1
2 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

4. Shell Programming and Scripting

finding the strings beween 2 characters "/" & "/" in .txt file

Hi all. I have a .txt file that I need to sort it My file is like: 1- 88 chain0 MASTER (FF-TE) FFFF 1962510 /TCK T FD2TQHVTT1 /jtagc/jtag_instreg/updateinstr_reg_1 dff1 (TI,SO) 2- ... (10 Replies)
Discussion started by: Behrouzx77
10 Replies

5. Shell Programming and Scripting

grep with "[" and "]" and "dot" within the search string

Hello. Following recommendations for one of my threads, this is working perfectly : #!/bin/bash CNT=$( grep -c -e "some text 1" -e "some text 2" -e "some text 3" "/tmp/log_file.txt" ) Now I need a grep success for some thing like : #!/bin/bash CNT=$( grep -c -e "some text_1... (4 Replies)
Discussion started by: jcdole
4 Replies

6. Shell Programming and Scripting

how to use "cut" or "awk" or "sed" to remove a string

logs: "/home/abc/public_html/index.php" "/home/abc/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" how to use "cut" or "awk" or "sed" to get the following result: abc abc xyz xyz xyz (8 Replies)
Discussion started by: timmywong
8 Replies

7. Shell Programming and Scripting

Compare two string and get "exact" difference only

Hi all; Pretty green to perl programming; been searching high and low for a perl (preferably) or unix script that will compare 2 CSV strings in the same file that are separated buy the "|" character (so basically they're side by side) and give the results of ONLY the exact change; note that 19... (3 Replies)
Discussion started by: gvolpini
3 Replies

8. Shell Programming and Scripting

grep regex, match exact string which includes "/" anywhere on line.

I have a file that contains the 2 following lines (from /proc/mounts) /dev/sdc1 /mnt/backup2 xfs rw,relatime,attr2,noquota 0 0 /dev/sdb1 /mnt/backup xfs rw,relatime,attr2,noquota 0 0 I need to match the string in the second column exactly so that only one result is returned, e.g. > grep... (2 Replies)
Discussion started by: jelloir
2 Replies

9. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

10. UNIX for Dummies Questions & Answers

echo "ABC" > file1.txt file2.txt file3.txt

Hi Guru's, I need to create 3 files with the contents "ABC" using single command. Iam using: echo "ABC" > file1.txt file2.txt file3.txt the above command is not working. pls help me... With Regards / Ganapati (4 Replies)
Discussion started by: ganapati
4 Replies

Featured Tech Videos