从前两列中的任何一列中提取 N 行,没有重复的字符串

Extract N lines with no duplicate strings from either of the two first columns

提问人:MrLungo 提问时间:11/16/2023 最后编辑:Mark RotteveelMrLungo 更新时间:11/19/2023 访问量:90

问:

我有一个巨大的 CSV 文件,其中包含成对的独特组合。我需要提取此文件的 N 行随机行,但我需要 col 1&2 中的字符串是唯一的,以便 col 1&2 字符串中的唯一字符串列表组合等于 2*N。

例如,给定的以下输入文件:

A,B,0.1747
B,C,0.373
C,D,0.585
E,J,0.8585
E,A,0.5657
F,A,0.5656

3 条随机线的可能期望输出为:

A,B,0.1747
C,D,0.585
E,J,0.8585

B,C,0.373
E,J,0.8585
F,A,0.5656

到目前为止,我已尝试使用以下方法将文件分别减少为列 1 和 2 中的唯一字符串:

shuf file.csv | awk  -F',' '!a[$1]++' | awk  -F',' '!a[$2]++'

获取

B,C,0.373
E,A,0.5657
A,B,0.1747
C,D,0.585

我不认为这是正确的方法。有没有办法遍历行,如果字符串已经存在于两列中的任何一列中,则不考虑该行?

bash awk sed grep 文本处理

评论

2赞 Renaud Pacalet 11/16/2023
你尝试了什么?它是如何失败的?
0赞 MrLungo 11/16/2023
到目前为止,我已经尝试使用洗牌整个文件,然后依次过滤第一列和第二列的重复项,但我认为这不是正确的方法shufawk -F',' '!a[$1]++'
0赞 Yunnosch 11/16/2023
请查看如何提问。特别是你似乎错过了根据你所尝试的内容实际提出问题的概念,同时提供细节,如一个最小的可重复的例子。请相应地编辑并添加有用的信息,而不是将它们放入评论中。
0赞 Yunnosch 11/16/2023
除此之外,我需要更多的解释,也许更多的例子,关于你想做什么。
0赞 user1934428 11/16/2023
所以基本上你正在寻找一种算法。怎么样:首先,你用它来创建文件的随机排列。然后按顺序读取文件,将行存储到一个关联数组中,其中键是行的前两个字段,值是整行。一旦您的数组增长到 200 个条目的大小,您就完成了。shuf

答:

1赞 Renaud Pacalet 11/16/2023 #1

当您使用两次时,通常只有一个脚本的更好解决方案。您可以尝试:awkawk

shuf file.csv |
  awk -F, '!(a[$1]+a[$2]) {a[$1]++; a[$2]++; n++; print} n==200 {exit}'

变体使用 和 :innext

shuf file.csv |
  awk -F, '$1 in a || $2 in a {next} {a[$1]; a[$2]; n++; print} n==200 {exit}'

注意:您的示例中没有具有相同第一个和第二个字段的输入行。但是,如果发生这种情况并且您想跳过这些行,则可以使用:

shuf file.csv |
  awk -F, '($1!=$2) && !(a[$1]+a[$2]) {a[$1]++; a[$2]++; n++; print}
           n==200 {exit}'

艺术

shuf file.csv |
  awk -F, '$1==$2 || $1 in a || $2 in a {next} {a[$1]; a[$2]; n++; print}
           n==200 {exit}'

评论

0赞 MrLungo 11/16/2023
Merci beaucoup!