Search code examples
bashawkcut

Use bash to cut lines in one file to lengths explicitly stated in another


I have one file that is a list of numbers, and another file (same number of lines) in which I need the length of each line to match the number of the line in the other file. For example:

file 1:

5
8
7
11
15

file 2:

abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

output:

abcde
abcdefgh
abcdefg
abcdefghijk
abcdefghijklmno

I've tried using awk and cut together but I keep getting the error "fatal: attempt to use array `line' in a scalar context". I'm not sure how else to go about this. Any guidance is much appreciated!


Solution

  • awk is your tool for this: one of

    # read all the lengths, then process file2
    awk 'NR == FNR {len[NR] = $1; next} {print substr($0, 1, len[FNR])}' file1 file2
    
    # fetch a line from file1 whilst processing file2
    awk '{getline len < lenfile; print substr($0, 1, len)}' lenfile=file1 file2