从前两列中提取没有重复字符串的 N 行[已关闭]

问题描述 投票:0回答:1

我有一个巨大的 CSV 文件,其中包含成对的独特组合。我需要提取该文件的 N 随机行,但我需要第 1 列和第 2 列中的字符串是唯一的,以便第 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 text-processing
1个回答
1
投票

当您使用

awk
两次时,通常有一个更好的解决方案,只需一个
awk
脚本。你可以尝试:

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

使用

in
next
的变体:

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}'
© www.soinside.com 2019 - 2024. All rights reserved.