【问题标题】:Add a random number at the end of each line of file在每行文件的末尾添加一个随机数
【发布时间】:2016-12-23 09:07:48
【问题描述】:

我愿意在文件的每一行末尾添加一个不同的随机数。我必须重复这个过程几次,每个文件包含大约 20k 行,每行包含大约 500k 个字符。

到目前为止我想出的唯一解决方案是

file="example.txt"
for lineIndex in $(seq 1 "$(wc -l ${file})")
do
    lineContent=$(sed "${lineIndex}q;d" ${file})
    echo "${lineContent} $RANDOM" >> tmp.txt
done
mv tmp.txt ${file}

有更快的解决方案吗?

【问题讨论】:

  • cat ${file} | wc -l 是无用的 Cat。只需wc -l ${file}
  • 谢谢,这种代码审查总是值得接受的!帖子已编辑。
  • 逐行读取文件:Bash FAQ 001

标签: string bash performance file


【解决方案1】:

你可以使用 awk:

awk '{ print $0, int(32768 * rand()) }' "$file" > tmp && \
    mv tmp "$file"

【讨论】:

  • @Remi.b:请务必使用srand,否则每次的随机数都是一样的,顺便说一句
【解决方案2】:

您可以更简单地进行操作,无需打开和关闭输入和输出文件,也无需在每一行生成新进程,如下所示:

while read line
do
    echo "$line $RANDOM"
done < "$file" > tmp.txt

【讨论】:

    【解决方案3】:

    您的脚本可以重写为:

    file="example.txt"
    cat ${file} | while read line; do
        echo "${line} $RANDOM"
    done > tmp.txt
    mv tmp.txt ${file}
    

    【讨论】:

      【解决方案4】:

      使用 awk:

      awk -v seed=$RANDOM 'BEGIN{srand(seed)} {print $0, int(rand() * 10^5+1)}' file
      

      如果你有 gnu awk 那么你可以使用inplace 保存文件:

      awk -i inplace -v seed=$RANDOM 'BEGIN{srand(seed)} {print $0, int(rand() * 10^5+1)}' file
      

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 2018-06-15
        • 2023-02-07
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        相关资源
        最近更新 更多