Curious question? How to put a string into two columns.

Now I have a list of numbers in hand and I try to put the numbers into two columns. Can I do this work with any script? Great thanks to your help!

1A1.log
HF=-240.451527
HF=-240.5213996
1A2.log
HF=-240.451527
HF=-240.5213996
1B.log
HF=-240.4273718
HF=-240.4956636
1C.log
HF=-240.4515273
HF=-240.5214005
1D1.log
1D2.log
1D.log
HF=-319.0829339
HF=-319.177099

I would like to get this output

1A1.log
HF=-240.451527   HF=-240.5213996
1A2.log
HF=-240.451527   HF=-240.5213996
1B.log
HF=-240.4273718   HF=-240.4956636
1C.log
HF=-240.4515273   HF=-240.5214005
1D1.log
1D2.log
1D.log
HF=-319.0829339   HF=-319.177099

It's better to get this

-240.451527     -240.5213996
-240.451527     -240.5213996
-240.4273718   -240.4956636
-240.4515273   -240.5214005
                                         !...two empty lines should be here...
                                         !...because of no numbers following "1D1.log" "1D2.log" in the input file, we should use two empty lines instead of them.
-319.0829339   -319.177099

Is this a stupid idea? Please help! thanks

awk '
  /^HF/ { printf $1 " "; getline }
  1
' file1

1A1.log
HF=-240.451527HF=-240.5213996
1A2.log
HF=-240.451527HF=-240.5213996
1B.log
HF=-240.4273718HF=-240.4956636
1C.log
HF=-240.4515273HF=-240.5214005
1D1.log
1D2.log
1D.log
HF=-319.0829339HF=-319.177099



awk -F= '
  /^HF/ { printf $2 " "; getline; print $2 }
' file1

-240.451527 -240.5213996
-240.451527 -240.5213996
-240.4273718 -240.4956636
-240.4515273 -240.5214005
-319.0829339 -319.177099

Does each log only ever contain 2 lines?

Not really. some did, but some logs have nothing follow it. Is this question clear? I just want to put the two numbers which behind the log in the same row.

---------- Post updated at 07:48 PM ---------- Previous update was at 07:42 PM ----------

Excellent script! It works well. But could you please help me to improve a little bit? If there are no numbers following the *log, we should put an empty line in the output. See the modified questing. Thank you very much! ....zhen

awk -F= '
  /.log/ && P { print "" }
  /.log/ { P=1 }
  /^HF/ { printf $2 " "; getline; print $2; P=0 }
' file1

-240.451527 -240.5213996
-240.451527 -240.5213996
-240.4273718 -240.4956636
-240.4515273 -240.5214005


-319.0829339 -319.177099

nawk -F= ' (NF > 0){a = $2;getline;printf("%s\n", a" "$2);next}1' $(ls *.log)

Perfect! It works. But I was so confused with this powerful script.
How did you put these empty lines?
Could you explain me something about this script.
I really want to learn something from here.
Thank you very much!

Very strange thing took place! see the following lines

1c1
< awk -F= '/.log/ && P { print "" }/.log/ { P=1 }/^HF/ { printf $2 "           " ; getline; print $2; P=0 }' TE.txt >> test7
---
> awk -F= '/.log/ && P { print "" }/.log/ { P=1 }/^HF/ { printf $2 "           " ; getline; print $2; p=0 }' TE.txt >> test7

I thought they are exactly the same code. But the outputs are totally different. The first line gave the correct output but the second line didn't.
Why? It's so strange that I cannot understand.
Output with the code of the first line

-240.451527           -240.5213996
-240.451527           -240.5213996
-240.4273718           -240.4956636
-240.4515273           -240.5214005


-319.0829339           -319.177099
-319.082436           -319.1777128
-319.0857963           -319.1786906
-319.0814125           -319.174904

-319.0814044           -319.1748736
-319.0827201           -319.173826
-319.0863378           -319.1788978
-319.075422           -319.1668696
-319.0650245           -319.1607778
-319.103556           -319.1942108

Output with the second line of the code.

-240.451527           -240.5213996

-240.451527           -240.5213996

-240.4273718           -240.4956636

-240.4515273           -240.5214005



-319.0829339           -319.177099

-319.082436           -319.1777128

-319.0857963           -319.1786906

-319.0814125           -319.174904


-319.0814044           -319.1748736

-319.0827201           -319.173826

-319.0863378           -319.1788978

-319.075422           -319.1668696

-319.0650245           -319.1607778

-319.103556           -319.1942108


-319.103556           -319.1942133

I took the lazy option of modifying the original script

 /.log/ && P { print "" }    # if the last line had ".log" in it (P > 0) print a blank line
 /.log/ { P=1 } # indicate we have a line with ".log" in it, the above line will evaluate to true if the next line has a ".log" in it
/^HF/ { printf $2 " "; getline; print $2; P=0 }

If a line starts with HF get the next line and print both together, reset P to say this line doesn't have ".log" in it. The HF= part is removed by using = as the field separator (-F=)

Or something like that!

I wouldn't really describe it as powerful.

---------- Post updated at 02:28 PM ---------- Previous update was at 01:47 PM ----------

They're not the same. The second one has a lowercase p in the /^HF/ action. Variable names are case-sensitive in UNIX (almost universally so).

I should have used a less ambiguous variable name than P (which does look like p)!

(instead of editing your previous posts, it helps if you reply to the thread. that way I can see your updates more easily - I'm notified that way)