Home > Software design >  Print random line into different text file
Print random line into different text file

Time:09-08

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

CodePudding user response:

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

CodePudding user response:

grep -Fxv -f B A | shuf -n 1 >> B

First part (grep) prints intersect 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.

  • Related