Copy last few lines of a file, perform math operation and iterate further


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Copy last few lines of a file, perform math operation and iterate further
# 1  
Old 02-23-2019
Copy last few lines of a file, perform math operation and iterate further

Hi,


I am trying to generate a data of following order:
Code:
4 0 1 642 643
4 642 643 1283 1284
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130
 ----------------------

4 1 2 643 644
4 643 644 1284 1285
4 1284 1285 1925 1926
4 1925 1926 2566 2567
4 2566 2567 3207 3208
4 3207 3208 3848 3849
4 3848 3849 4489 4490
4 4489 4490 5130 5131 
--------------------- 
4 2 3 644 645
4 644 645 1285 1286
4 1285 1286 1926 1927
4 1926 1927 2567 2568
4 2567 2568 3208 3209
4 3208 3209 3849 3850
4 3849 3850 4490 4491
4 4490 4491 5131 5132

where the 1st column is a constant with value 4. Values in columns 2,3,4,5 are incremented by 1 based on the data of previously available 8 rows.

I have tried:
Code:
BEGIN {FS=" "}
{
 i = 1
 while (i<=2)
 {
  printf ("%f ", tail-8)
  i++
 }
printf ("\n");
}

But the output is -8.000. I am trying to use the previous 8 lines for an increment operation but it sees this as a number to output.
Any suggestions?
# 2  
Old 02-23-2019
see if it helps.
If sapa.txt is:
Code:
4 0 1 642 643
4 642 643 1283 1284
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130

running awk -v rep=3 -f sapa.awk sapa.txt
where
sapa.awk is:
Code:
BEGIN {
  if (!rep) rep=5
}
{
   for(i=1;i<=NF;i++)
      a[FNR%8,i]=$i
   nf=NF
}
1
END {
   print "---"
   for(cnt=1;cnt<=rep;cnt++)  {
     for(row=1;row<=8;row++) {
       printf("%s%s", $1, OFS)
       for(i=2;i<=nf;i++)
         printf("%s%s", ++a[row%8,i], (i==nf)?ORS:OFS)
     }
     print "---"
   }
}

produces:
Code:
4 0 1 642 643
4 642 643 1283 1284
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130
---
4 1 2 643 644
4 643 644 1284 1285
4 1284 1285 1925 1926
4 1925 1926 2566 2567
4 2566 2567 3207 3208
4 3207 3208 3848 3849
4 3848 3849 4489 4490
4 4489 4490 5130 5131
---
4 2 3 644 645
4 644 645 1285 1286
4 1285 1286 1926 1927
4 1926 1927 2567 2568
4 2567 2568 3208 3209
4 3208 3209 3849 3850
4 3849 3850 4490 4491
4 4490 4491 5131 5132
---
4 3 4 645 646
4 645 646 1286 1287
4 1286 1287 1927 1928
4 1927 1928 2568 2569
4 2568 2569 3209 3210
4 3209 3210 3850 3851
4 3850 3851 4491 4492
4 4491 4492 5132 5133
---

These 3 Users Gave Thanks to vgersh99 For This Post:
# 3  
Old 02-23-2019
Try also


Code:
awk '
T[NR]=$0

END     {for (k=1; k<=REP; k++) {++INC
                                 print "----"
                                 for (j=1; j<=NR; j++)  {$0 = T[j]
                                                         for (i=2; i<=NF; i++) $i+=INC
                                                         print
                                                        }
                                }
        }
' REP=3 file
4 0 1 642 643
4 642 643 1283 1284
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130
----
4 1 2 643 644
4 643 644 1284 1285
4 1284 1285 1925 1926
4 1925 1926 2566 2567
4 2566 2567 3207 3208
4 3207 3208 3848 3849
4 3848 3849 4489 4490
4 4489 4490 5130 5131
----
4 2 3 644 645
4 644 645 1285 1286
4 1285 1286 1926 1927
4 1926 1927 2567 2568
4 2567 2568 3208 3209
4 3208 3209 3849 3850
4 3849 3850 4490 4491
4 4490 4491 5131 5132
----
4 3 4 645 646
4 645 646 1286 1287
4 1286 1287 1927 1928
4 1927 1928 2568 2569
4 2568 2569 3209 3210
4 3209 3210 3850 3851
4 3850 3851 4491 4492
4 4491 4492 5132 5133

These 3 Users Gave Thanks to RudiC For This Post:
# 4  
Old 02-23-2019
Code:
#!/bin/bash
bc <<<'
define row (t,j) { auto n, p, b
        m = 642;
        for ( i=1; i<=8; i++ ) {
        print 4," ",t+n-p+b," ",t+n+1-p+b," ",t+n+m-p," ",t+n+m+1-p++,"\n"
        n+=m; b=1
        }
        print "----------\n"
        if(--j) o = row (++t,j)
}
o = row (0,4)'

These 2 Users Gave Thanks to nezabudka For This Post:
# 5  
Old 02-23-2019
Thanks for the replys!!



I could do the required in the following simple few lines (as many have answer as well!!).

Code:
#!/bin/bash
for k in {1..639}
do
   echo "$k th iteration"
   tail -8 MWE.txt > i
   awk '{print $1, $2+1, $3+1, $4+1, $5+1}' i > j
   cat j >> MWE.txt
done

These 2 Users Gave Thanks to SaPa For This Post:
# 6  
Old 02-24-2019
Hi SaPa,


thanks for sharing your working (!) approach.
Pls be aware that it contains elements that were not specified in post #1 and thus could not be covered by the proposals given. Also, running 3 external commands in extra processes, plus 4 file operations (open), for each of the 639 iterations might not be the most efficient usage of resources.


@nezabudka: Thanks for your "exotic" approach, giving me and my aspects / perspective / tool box a new dimension!
This User Gave Thanks to RudiC For This Post:
# 7  
Old 02-24-2019
At least you should consider a pipe and no cat, while in this case the input file and output file are identical, so you need one temp file.
Code:
   tail -8 MWE.txt >i
   awk '{print $1, $2+1, $3+1, $4+1, $5+1}' i >> MWE.txt


Last edited by MadeInGermany; 02-24-2019 at 06:52 AM..
This User Gave Thanks to MadeInGermany For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk script to find data in three file and perform replace operation

Have three files. Any other approach with regards to file concatenation or splitting, etc is appreciated If column55(billngtype) of file1 contains YMNC or YPBC then pick the value of column13(documentnumber). Now find this documentnumber in column1(Billdoc) of file2 and grep the corresponding... (4 Replies)
Discussion started by: as7951
4 Replies

2. Shell Programming and Scripting

awk --> math-operation in data-record and joining with second file data

Hi! I have a pretty complex job - at least for me! i have two csv-files with meassurement-data: fileA ...... (2 Replies)
Discussion started by: IMPe
2 Replies

3. Shell Programming and Scripting

awk --> math-operation in a array

Hi main object is categorize the difference of data-values (TLUFT02B - TLUFT12B). herefor i read out data-files which are named acording to the timeformat yyyymmddhhmm. WR030B 266.48 Grad 0 WR050B 271.46 Grad 0 WR120B 268.11 Grad 0 WV030B 2.51 m/s ... (6 Replies)
Discussion started by: IMPe
6 Replies

4. Shell Programming and Scripting

How To Perform Mathematical Operation Within If in awk?

Hi All, I am using an awk script as below: awk -F'|' 'BEGIN{OFS="|";} { if ($1==$3 && $3==$7 && $7==$13 && $2==$6 && $6==$11 && $15-$14+1==$11) print $0"|""TRUE"; else print $0"|""FALSE"; }' tempfile.txt In above script, all conditions are being checked except the one which is... (4 Replies)
Discussion started by: angshuman
4 Replies

5. Homework & Coursework Questions

Using dbms_pipe with C++ to perform daabase operation

I am getting two result: string and int in c++ code. That I want to store into database. The request which generates result is very frequent. So each time performing db operation to store the result is costly for me. So how this can be achived using dbms_sql? I dont have any experience and how... (1 Reply)
Discussion started by: karimkhan
1 Replies

6. Shell Programming and Scripting

[Solved] Perform an operation to all directories

Sorry, about this thread - I solved my own problem! Thanks for taking a look. edit by bakunin: no problem, but it would have been a nice touch to actually tell us what the solution was. This would have been slightlich more educating than just knowing that you found it. I changed your title to... (0 Replies)
Discussion started by: Blue Solo
0 Replies

7. Shell Programming and Scripting

awk math operation on two files

Hi, I need your help. I've got two files and i need to add 2nd line after occurrence of "Group No X" from data2.txt to 3rd line (after occurrence of "Group No X") from data1.txt. There is the same number of "Groups" in both files and the numbers of groups have the same pattern. data1.txt Group... (2 Replies)
Discussion started by: killerbee
2 Replies

8. Shell Programming and Scripting

Enter third column & Perform Operation

I am trying to enter a third column in this file, but the third column should that I call "Math" perform a some math calculations based on the value found in column #2. Here is the input file: Here is the desired output: Output GERk0203078$ Levir Math Cotete_1... (5 Replies)
Discussion started by: Ernst
5 Replies

9. Emergency UNIX and Linux Support

Logic for file copy operation

Hi, i need to copy contents from source to destination with a few conditions, Please helpme out. Sample input file $>cat testfile.txt /a/b/c/d | /e/f/g/d (d can be either a file or directory) my conditions are: check if destination is valid and if its a file or directory if its a... (5 Replies)
Discussion started by: raghu_shekar
5 Replies

10. Shell Programming and Scripting

How to perform arithmetic operation on date

Hi all, I would appreciate if anyone knows how to perform adding to date. As for normal date, i can easily plus with any number. But when it comes to month end say for example 28 Jun, i need to perform a plus with number 3, it will not return 1 Jul. Thanks in advance for your help. (4 Replies)
Discussion started by: agathaeleanor
4 Replies
Login or Register to Ask a Question

Featured Tech Videos