একটি ফাইল থেকে এলোমেলো লাইন নির্বাচন করুন


240

বাশ স্ক্রিপ্টে, আমি ইনপুট ফাইল এবং আউটপুট থেকে অন্য একটি ফাইল থেকে এন এলোমেলো লাইনগুলি তুলতে চাই।

কিভাবে এই কাজ করা যেতে পারে?


ফাইল এলোমেলোভাবে বাছাই করুন এবং এন প্রথম লাইন চয়ন করুন।
পাইওটর প্রস্ম্মো


31
এটি কোনও সদৃশ নয় - তিনি এন লাইন বনাম 1 লাইন চান।
ওয়ানসোলিটারি নুব


1
sort -Rবিশেষত দীর্ঘ ফাইলের জন্য এটি প্রচুর অতিরিক্ত কাজ করে বলে আমি একমত নই । আপনি ব্যবহার করতে পারেন $RANDOM, % wc -l, jot, sed -n(লা à stackoverflow.com/a/6022431/563329 ), এবং ব্যাশ কার্যকারিতা (অ্যারে, কমান্ড পুনঃনির্দেশ, ইত্যাদি) আপনার নিজের সংজ্ঞায়িত করতে peekফাংশন যা আসলে 5,000,000-লাইন ফাইল চালানো হবে।
isomorphismes

উত্তর:


627

ব্যবহার করুন shufসঙ্গে -nনিচের চিত্রের বিকল্প, পেতে Nর্যান্ডম লাইন:

shuf -n N input > output

2
আপনার যদি কেবল ল্যান্ডমগুলির একটি এলোমেলো সেট দরকার হয়, তবে এলোমেলো ক্রমে নয়, তবে শূফ খুব অদক্ষ (বড় ফাইলের জন্য): এই উত্তরের মতো জলাধার নমুনা করা আরও ভাল ।
পেট্রেলহর্প

আমি এটি 1000 সারি উত্তোলনের জন্য 500 এম সারির একটি ফাইলটিতে চালিয়েছি এবং এটি 13 মিনিট সময় নিয়েছে। কয়েক মাস ধরে ফাইলটি অ্যাক্সেস করা হয়নি, এবং এটি একটি অ্যামাজন ইসি 2 এসএসডি ড্রাইভে রয়েছে।
টি। ব্রায়ান জোন্স

সুতরাং এটি সংক্ষেপে আরও এলোমেলো যে sort -R?
মোনা জালাল

1
@ মোনাজালাল কেবলমাত্র তাড়াহুড়ো করে না, যেহেতু একেবারে লাইন তুলনা করতে হবে না।
রজারডপ্যাক

এটি কি শেষ অবধি একাধিকবার একই লাইন দেয়?
ফ্রেডরিক নর্ড 20

161

ফাইল এলোমেলোভাবে বাছাই করুন এবং প্রথম 100লাইনগুলি চয়ন করুন:

$ sort -R input | head -n 100 >output

43
sortপ্রকৃতপক্ষে অভিন্ন লাইনগুলি একসাথে সাজান, সুতরাং আপনার যদি সদৃশ লাইন থাকতে পারে এবং আপনার shuf(একটি gnu সরঞ্জাম) ইনস্টল করা থাকে তবে এটির জন্য এটি ব্যবহার করা ভাল।
কেভিন

22
আন্দালসো, আপনার কাছে যদি যথেষ্ট পরিমাণে বিশাল ফাইল - ৮০ কেজি লাইন থাকে - তবে তা তাত্ক্ষণিকভাবে কাজ করে তবে এটি আপনাকে অবশ্যই অনেক অপেক্ষা করতে বাধ্য করবে shuf -n
রুবেন্স

28
বাছাই -আর ম্যাক ওএস এক্স (10.9) এর অধীন উপলব্ধ নেই
মিরকো ইবার্ট

2
@ tfb785: sort -Rসম্ভবত জিএনইউ বিকল্প, জিএনইউ কোর্টিল ইনস্টল করুন। বিটিডাব্লু, shufকোরওটিলসেরও একটি অংশ।
jfs

1
@JFSebastian কোড: sort -R input | head -n <num_lines>। ইনপুট ফাইলটি ছিল 2B + লাইন সহ 279GB। যদিও ভাগ করে নিতে পারছি না। যাইহোক, পয়েন্টটি হ'ল আপনি আউটপুট কী করে তা র্যান্ডম নির্বাচন করতে শফলের সাথে স্মৃতিতে কিছু লাইন রাখতে পারেন । আপনার প্রয়োজনীয়তা যা তা বিবেচনা না করেই পুরো ফাইলটিকে বাছাই করতে চলেছে বাছাই করা ।
রুবেন্স

18

আচ্ছা শফের উত্তরে একটি মন্তব্য অনুসারে তিনি এক মিনিটের মধ্যে 78৮,০০০,০০০ লাইন বদলে ফেলেন।

চ্যালেঞ্জ গ্রহন করা হল...

প্রথমে আমার 78.000.000.000 লাইনের ফাইল দরকার:

seq 1 78 | xargs -n 1 -P 16 -I% seq 1 1000 | xargs -n 1 -P 16 -I% echo "" > lines_78000.txt
seq 1 1000 | xargs -n 1 -P 16 -I% cat lines_78000.txt > lines_78000000.txt
seq 1 1000 | xargs -n 1 -P 16 -I% cat lines_78000000.txt > lines_78000000000.txt

এটি আমাকে 78 বিলিয়ন নিউলাইনস ;-) সহ এএ ফাইল দেয়

এখন শাফ অংশের জন্য:

$ time shuf -n 10 lines_78000000000.txt










shuf -n 10 lines_78000000000.txt  2171.20s user 22.17s system 99% cpu 36:35.80 total

বাধাটি সিপিইউ ছিল এবং একাধিক থ্রেড ব্যবহার করছে না, এটি ১ টি কোর পিন করেছে 100% এ অন্য 15 টি ব্যবহার করা হয়নি।

পাইথন হ'ল আমি নিয়মিত যা ব্যবহার করি তাই এটি এটিকে দ্রুত করার জন্য আমি ব্যবহার করব:

#!/bin/python3
import random
f = open("lines_78000000000.txt", "rt")
count = 0
while 1:
  buffer = f.read(65536)
  if not buffer: break
  count += buffer.count('\n')

for i in range(10):
  f.readline(random.randint(1, count))

এটি আমাকে এক মিনিটের মধ্যে পেয়েছে:

$ time ./shuf.py         










./shuf.py  42.57s user 16.19s system 98% cpu 59.752 total

আমি i9 এবং স্যামসাং এনভিএম এর সাথে একটি লেনোভো এক্স 1 এর চরম দ্বিতীয় জেনে এটি করেছি যা আমাকে প্রচুর পড়ার এবং লেখার গতি দেয়।

আমি জানি এটি দ্রুততর হতে পারে তবে আমি অন্যদের চেষ্টা করার জন্য কিছু জায়গা রেখে দেব।

লাইন কাউন্টার উত্স: লুথার ব্লিসसेट

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.