1

I am trying to combine two TXT files somewhat randomly and to do this I am trying to use head and sed to move X amount of lines to a new file and delete the lines from the old file. The problem is, because it is a random value, I can't tell sed just how many lines to delete. Here is what I tried to use that doesn't work as desired:

head -$(shuf -i 3-6 -n1) firstfile.txt > combine.txt && sed -i '1,+$(shuf -i 2-5 -n1)d' firstfile.txt

The problem with the above code is the second use of shuf does not match what the first one is. For example, the first shuf could be 5 and the second shuf could be 3. But I want the second shuf to always be first shuf -1 (so if 1st shuf is 5, second should be 4)

Any solution where I can get the second shuf to match the first or an easier way to do this?

M. Nejat Aydin
  • 9,597
  • 1
  • 7
  • 17

3 Answers3

1

You can do it using a single GNU sed command without resorting to head or a temporary variable:

sed -ni "1,$(shuf -i 3-6 -n1)!{p;d;}; w combine.txt" firstfile.txt
M. Nejat Aydin
  • 9,597
  • 1
  • 7
  • 17
1

Here is a step-by-step commented method with Bash:

#!/usr/bin/env bash

source='source.txt'
destination='destination.txt'

# Creates test source and destination files, and populates source if needed
if ! [ -f "${source}" ]; then
  # Creates and populates source
  printf 'Source file line %s\n' {1..100} >"${source}"

  # Creates and erases destination
  : > "${destination}"
fi

# Proceeds to test

# Shuffles lines from source file and pipes it to commands group
shuf "${source}" | {

  # Captures 10 shuffled lines
  mapfile -n 10 -t lines

  # If no line read, then exit this sub-shell
  [ 0 -eq "${#lines[@]}" ] && exit

  # Appends those 10 lines to the destination file
  printf '%s\n' "${lines[@]}" >>"${destination}"

  # Writes back the remaining lines to source
  cat >"${source}"
}
Léa Gris
  • 17,497
  • 4
  • 32
  • 41
0

You can save the result of shuf in a variable and reuse it.

shuf_value=$(shuf -i 3-6 -n1)
head -"${shuf_value}" firstfile.txt > combine.txt &&
sed -i "1,+$(( shuf_value-1 ))d" firstfile.txt
tjm3772
  • 2,346
  • 2
  • 10