【问题标题】:randomly sample text string based on matching prefix bash基于匹配前缀bash随机采样文本字符串
【发布时间】:2020-07-22 22:27:26
【问题描述】:

我有一个列表,我想为每个唯一前缀随机选择一个文本字符串。例如,这是我的清单:

apples_1
apples_2
apples_3
banana_1
banana_2
pears_3

对于每个唯一的前缀(苹果、香蕉、梨),我想随机选择一个。所需的输出将是:

apples_3
banana_1
pears_3

我在 SO using arrays 上看到过类似的帖子 herehere,但我不清楚如何在这里应用这些答案。 我完全不知道如何去做这件事。任何让我开始的建议将不胜感激。

编辑:根据用户评论显示我尝试过的内容:

  1. 正在尝试应用上面的 SO 数组链接:
ARRAY=(filename.txt)
N1=$((RANDOM % 5))
SDFFILE=${ARRAY[$N1]}
echo $SDFFILE

根据帖子,我假设上面会返回 5 行随机文本,我会尝试从那里构建。什么也没发生,我无法按照这些答案进行故障排除。

  1. 然后我开始考虑拆分文本字符串并选择唯一的前缀行之一。
cut -d'_' -f 1

Above 返回所有前缀(现在重复),但很明显,如果我从该列表中进行二次抽样,它不会进行二次抽样,因为它只会返回:

apples
banana
pears

我很难考虑如何实现这一点。谢谢。

【问题讨论】:

    标签: bash shell random grep


    【解决方案1】:

    最直接的方法是使用sort -R (GNU sort) 来打乱您的文件。

    首先是随机排序的前缀列表:

    # sort -t_ -k1,1R filename.txt
    apples_1
    apples_2
    apples_3
    pears_3
    banana_1
    banana_2
    

    您想保留每个前缀的第一行,请使用-u 选项:

    # sort -t_ -k1,1R -u filename.txt
    pears_3
    banana_1
    apples_1
    

    现在的问题是,在分隔符“_”之后的第二个字段按原样保持不变。因此-u 选项将始终为每个前缀输出同一行。

    解决方法是先将输入文件打乱:

    # sort -R filename.txt | sort -t_ -k1,1R -u
    pears_3
    apples_3
    banana_2
    

    PS:在您的第一次尝试中,ARRAY=(filename.txt) 不会用内容filename.txt 填充ARRAY。为此使用readarray(或其别名mapfile):

    # readarray -t ARRAY < filename.txt
    

    【讨论】:

    • 这对我很有用,因为我有很多独特的前缀!澄清一下:-k1,1 仅按第一个字段排序,否则行按所有字段排序(_ 之前和之后),对吗?
    • 正确。而对第一个字段的这种限制也是-u 标志起作用的原因..
    【解决方案2】:

    如果你知道 中的前缀,我会怎么做:

    for fruit in apples banana pears; do
        grep "$fruit" Input_File | shuf | head -1
    done
    

    apples_1
    banana_1
    pears_3
    

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多