首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux 腳本隨機抽取文件指定行數:Python/AWK/Java 實現思路

     編輯:程式設計綜合問答

需求

在 Linux 環境下,編寫腳本(Python/AWK/Java 均可)從指定文件隨機讀取若干行,寫入目標文件。

核心思路

隨機抽樣兩大流派:

  1. 全量讀入內存 → 隨機選索引 → 輸出:適合文件較小(< 可用內存)。
  2. 水庫抽樣:單遍歷、恆定內存、適合超大文件。

方案一:Python 簡潔實現(全量讀入)

#!/usr/bin/env python3
import sys, random

def random_lines(src, dst, k):
    with open(src, 'r', encoding='utf-8') as f:
        lines = f.readlines()
    if k > len(lines): k = len(lines)
    chosen = random.sample(lines, k)
    with open(dst, 'w', encoding='utf-8') as f:
        f.writelines(chosen)

if __name__ == '__main__':
    # 用法: python3 random_lines.py source.txt target.txt 10
    random_lines(sys.argv[1], sys.argv[2], int(sys.argv[3]))

方案二:AWK 單行命令(水庫抽樣,無需全量讀入)

# 抽取 10 行
awk 'BEGIN{srand()} {lines[NR]=$0} END{for(i=1;i<=10;i++) print lines[int(rand()*NR)+1]}' bigfile.txt > sample.txt
# 更標準的水庫抽樣 (GNU awk)
awk -v k=10 'BEGIN{srand()} NR<=k{a[NR]=$0; next} {j=int(rand()*NR); if(j sample.txt

方案三:Java 完整類(可集成到項目)

import java.io.*;
import java.nio.file.*;
import java.util.*;

public class RandomLineSampler {
    public static void sample(String src, String dst, int k) throws IOException {
        List reservoir = new ArrayList<>(k);
        long count = 0;
        try (BufferedReader br = Files.newBufferedReader(Paths.get(src))) {
            String line;
            while ((line = br.readLine()) != null) {
                count++;
                if (reservoir.size() < k) {
                    reservoir.add(line);
                } else {
                    long r = new Random().nextLong(count);
                    if (r < k) reservoir.set((int) r, line);
                }
            }
        }
        Files.write(Paths.get(dst), reservoir, StandardCharsets.UTF_8);
    }
    public static void main(String[] args) throws IOException {
        sample(args[0], args[1], Integer.parseInt(args[2]));
    }
}

方案對比

方案內存速度適用文件大小依賴
Python 全量O(N)快< 500MBPython 3
AWK 水庫O(k)中任意 (GB 級)GNU Awk
Java 水庫O(k)中任意JRE 8+

進階需求:可重現性

設置隨機種子:

  • Python: random.seed(42)
  • AWK: BEGIN{srand(42)}
  • Java: new Random(42L)

總結

小文件用 Python random.sample 一行搞定;大文件用 AWK/Java 水庫抽樣恆定內存。根據項目技術棧與文件體量選型即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved