gpt4 book ai didi

shell - 使用 shell 删除特定列中包含特定字符串的行的 50%

转载 作者:行者123 更新时间:2023-12-01 11:24:15 24 4
gpt4 key购买 nike

我有一个包含很多行和列的数据文件。我想随机删除第二列中包含数字“2”的行的 50%。我怎样才能在 shell 脚本中执行此操作?我的文件看起来像这样:

264 2 -1.2000000000000000e+00 7.0825130926872939e+00 9.5601084339752944e+00 7.2651799153974066e+00 
245 4 2.3999999999999999e+00 3.2314933672268427e+00 8.1060222635488888e+00 4.9300995049182887e+00
602 2 2.3999999999999999e+00 7.9943142143951045e+00 8.9555257846190486e+00 6.1149829552712900e+00
323 3 -1.2000000000000000e+00 9.5688081384508621e+00 1.0611671606914694e+01 8.9952891594417164e+00
45 3 -1.2000000000000000e+00 9.4185463105240714e+00 9.3227605688201560e+00 6.6654941991009027e+00
103 2 2.3999999999999999e+00 1.0178713184773681e+01 1.0522860587449216e+01 7.5396990175229996e+00
462 2 2.3999999999999999e+00 4.2166316392533885e+00 6.9152554630316221e+00 7.5523911902369765e+00
239 3 -1.2000000000000000e+00 7.8204053112970211e+00 8.2536094294868985e+00 9.4685060963111152e+00
598 3 -1.2000000000000000e+00 7.9895230606907504e+00 7.3376809962958367e+00 6.1930783591087541e+00

最佳答案

假设您的数据在名为input 的文件中:

awk 'BEGIN{srand()} $2!=2 || int(2*rand()) {print}' input

解释:

  • BEGIN{srand()}

    这会为随机数生成器选择一个随机种子。这在 awk 开始遍历文件的每一行之前完成一次。

  • $2!=2 || int(2*rand()) {print}

    awk 中,这是一个带有条件的语句。语句是 print 它将打印整个当前行,但前提是条件为真。该条件有两个部分,它们是 or-d 在一起的。如果第二列具有 2 以外的任何值,则条件为真:$2!=2。或者,如果 int(2*rand()) 的计算结果为非零,则为 true,随机发生的概率为 50-50。

    因此,大约一半的第二列等于 2 的行被随机删除。

得到恰好一半

如果一个人以 50-50 的机会保留 $2==2 行,那么他不会恰好保留 50%,就像掷一枚均匀的硬币不会给出 恰好 50% 正面。以下代码补偿了该保留,假设受影响的行数为偶数,正好是 50%:

awk 'BEGIN{srand()}
NR==FNR && $2==2 {a[j++]=rand()}
NR==FNR {next}
FNR==1 {n=asort(a,b); cutoff=b[n/2]}
$2!=2 {print; next}
a[i++]<=cutoff {print}' input input

工作原理:上面的代码遍历文件两次。在第一次检查时,它为 $2==2 的每一行分配一个随机数。这些值存储在数组 a 中。在第二次检查开始时,对这些数字进行排序并分配一个截止值。打印随机数小于或等于截止值的任何 $2==2 行。

因为这使用了 asort 函数,所以需要 GNU awk

关于shell - 使用 shell 删除特定列中包含特定字符串的行的 50%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com