我想做的是将文本文件a中的一行随机打印到文本文件B中,而不必两次选择同一行。因此,如果文本文件B中有一行数字为25,它将不会从文本文件a 中选择该行
我已经学会了如何将一行从文本文件a随机打印到文本文件B,但是,我不知道如何确保它不会两次选择同一行。
echo "$(printf $(cat A.txt | shuf -n 1))" > /home/B.txt
grep -Fxv -f B A | shuf -n 1 >> B
第一部分(grep
(将A
和B
的差异打印到stdout,即A
中存在但B
中不存在的行:
-F
--将模式解释为固定字符串,而不是正则表达式-x
—仅选择与整行完全匹配的匹配项-v
——反转匹配感-f FILE
——从FILE中获取模式
第二部分(shuf -n 1
(从stdin打印随机行。输出附加到B
。
这不是真的"随机";,然后没关系。
请尝试以下awk
解决方案-我认为它实现了您想要实现的目标。
$ 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