skip to Main Content

What I want to do is print a random line from text file A into text file B WITHOUT it choosing the same line twice. So if text file B has a line with the number 25 in it, it will not choose that line from text file A

I have figured out how to print a random line from text file A to text file B, however, I am not sure how to make sure it does not choose the same line twice.

echo "$(printf $(cat A.txt | shuf -n 1))" > /home/B.txt

2

Answers


  1. That’s not really "random", then. Never mind.

    Please try the following awk solution – I think it does what you’re trying to achieve.

    $ cat A
    11758
    1368
    26149
    2666
    27666
    11155
    31832
    11274
    21743
    25
    $ cat B
    18518
    8933
    941
    32286
    1234
    25
    1608
    5284
    23040
    19028
    $ cat pseudo
    BEGIN{
      "bash -c 'echo ${RANDOM}'"|getline seed  # Generate a random seed
      srand(seed)                              # use random seed, otherwise each repeated run will generate the same random sequence
      count=0                                  # set a counter 
    }
    NR==FNR{                                   # while on the first file, remember every number; note this will weed out duplicates!
      b[$1]=1
    }
    !($1 in b) {                               # for numbers we haven't seen yet (so on the second file, ignoring ones present in file B)
      a[count]=$1                              # remember new numbers in an associative array with an integer index
      count++
    }
    END{
    r=(int(rand() * count))                  # generate a random number in the range of our secondary array's index values
    print a[r] >> "B"                        # print that randomly chosen element to the last line of file B
    }
    $ awk -f pseudo B A
    $ cat B
    18518
    8933
    941
    32286
    1234
    25
    1608
    5284
    23040
    19028
    27666
    $
    $ awk -f pseudo B A
    $ cat B
    18518
    8933
    941
    32286
    1234
    25
    1608
    5284
    23040
    19028
    27666
    31832
    
    Login or Signup to reply.
  2. grep -Fxv -f B A | shuf -n 1 >> B
    

    First part (grep) prints difference of A and B to stdout, i.e. lines present in A but absent in B:

    • -F — Interpret PATTERNS as fixed strings, not regular expressions.
    • -x — Select only those matches that exactly match the whole line.
    • -v — Invert the sense of matching.
    • -f FILE — Obtain patterns from FILE.

    Second part (shuf -n 1) prints random line from stdin. Output is appended to B.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search