user3116130
user3116130

Reputation: 65

Shell script copying lines from multiple files

I have multiple files which have the same structure but not the same data. Say their names are values_#####.txt (values_00001.txt, values_00002.txt, etc.).

I want to extract a specific line from each file and copy it in another file. For example, I want to extract the 8th line from values_00001.txt, the 16th line from values_00002.txt, the 24th line from values_00003.txt and so on (increment = 8 each time), and copy them line by line in a new file (say values.dat).

I am new to shell scripting, I tried to use sed, but I didn't figure out how to do that.

Thank you in advance for your answers !

Upvotes: 1

Views: 274

Answers (2)

anubhava
anubhava

Reputation: 785058

I believe ordering of files is also important to make sure you get output in desired sequence.

Consider this script:

n=8
while read f; do
   sed $n'q;d' "$f" >> output.txt
   ((n+=8))
done < <(printf "%s\n" values_*.txt|sort -t_ -nk2,2)

Upvotes: 1

fedorqui
fedorqui

Reputation: 289555

This can make it:

for var in {1..NUMBER}
do
    awk -v line=$var 'NR==8*line' values_${var}.txt >> values.dat
done

Explanation

  • The for loop is basic.
  • -v line=$var "gives" the $var value to awk, so it can be used with the variable line.
  • 'NR==8*line' prints the line number 8*{value we are checking}.
  • values_${var}.txt gets the file values_1.txt, values_2.txt, and so on.
  • >> values.dat redirects to values.dat file.

Test

I created 3 equal files a1, a2, a3. They contain 30 lines, being each one the line number:

$ cat a1
1
2
3
4
...

Executing the one liner:

$ for var in {1..3}; do awk -v line=$var 'NR==8*line' a${var} >> values.dat; done
$ cat values.dat 
8
16
24

Upvotes: 0

Related Questions