আমি নই নিশ্চিত এই মেমরি এরকম বেশী ভালো, কিন্তু একটি সঙ্গে sed
যে r
তার infile মধ্যে যে লাইন এবং অন্য একটি পাইপ ওপারে তার এর infile আউট EADS পর্যায়ক্রমে H
ইনপুট লাইনের পুরাতন স্থান ...
cat <<\IN >/tmp/tmp
Row1,10
Row2,20
Row3,30
Row4,40
IN
</tmp/tmp sed -e 'i\
' -e 'r /tmp/tmp' |
sed -n '/./!n;h;N;/\n$/D;G;s/\n/ /;P;D'
আউটপুট
Row1,10 Row1,10
Row1,10 Row2,20
Row1,10 Row3,30
Row1,10 Row4,40
Row2,20 Row1,10
Row2,20 Row2,20
Row2,20 Row3,30
Row2,20 Row4,40
Row3,30 Row1,10
Row3,30 Row2,20
Row3,30 Row3,30
Row3,30 Row4,40
Row4,40 Row1,10
Row4,40 Row2,20
Row4,40 Row3,30
Row4,40 Row4,40
আমি এটি অন্যভাবে করেছি। এটি স্মৃতিতে কিছু সঞ্চয় করে - এটি স্ট্রিংয়ের মতো সঞ্চয় করে:
"$1" -
... ফাইলের প্রতিটি লাইনের জন্য।
pairs(){ [ -e "$1" ] || return
set -- "$1" "$(IFS=0 n=
case "${0%sh*}" in (ya|*s) n=-1;; (mk|po) n=+1;;esac
printf '"$1" - %s' $(printf "%.$(($(wc -l <"$1")$n))d" 0))"
eval "cat -- $2 </dev/null | paste -d ' \n' -- $2"
}
এটা খুব দ্রুত। এটি cat
ফাইলটির যতবার আছে ততবার ফাইলটিতে লাইন রয়েছে a |pipe
। পাইপের ওপারে যে ইনপুটটি ফাইলের মধ্যে লাইন থাকে ততবার ফাইলের সাথে একত্রীকরণ করা হয়।
case
- স্টাফ শুধুমাত্র বহনযোগ্যতা জন্য yash
এবং zsh
যখন বিভক্ত উভয় অ্যাড এক উপাদান mksh
এবং posh
উভয় এক হারান। ksh
, dash
, busybox
, এবং bash
সেখানে শূণ্যসমূহ যেমন দ্বারা মুদ্রিত হয় বহু ক্ষেত্রে যেমন ঠিক কাছে সব বিভক্ত printf
। উপরে লিখিত হিসাবে আমার মেশিনে উল্লিখিত শেলগুলির প্রত্যেকের জন্য একই ফলাফল রেন্ডার করে।
তাহলে ফাইল খুব দীর্ঘ, হতে পারে $ARGMAX
অনেক বেশি তর্ক যে ক্ষেত্রে আপনাকে পরিচয় করিয়ে দিতে হবে সমস্যা xargs
বা অনুরূপ হিসাবে ভাল।
আউটপুট অভিন্ন হওয়ার আগে আমি একই ইনপুট ব্যবহার করেছি। তবে, আমি যদি আরও বড় হয়ে যাই ...
seq 10 10 10000 | nl -s, >/tmp/tmp
এটি আমার আগে ব্যবহৃত (সানস 'সারি') এর মতো প্রায় একই রকম একটি ফাইল তৈরি করে - তবে 1000 লাইনে। আপনি নিজেই দেখতে পান এটি কত দ্রুত:
time pairs /tmp/tmp |wc -l
1000000
pairs /tmp/tmp 0.20s user 0.07s system 110% cpu 0.239 total
wc -l 0.05s user 0.03s system 32% cpu 0.238 total
1000 লাইনে শাঁসের মধ্যে পারফরম্যান্সে কিছুটা প্রকারভেদ রয়েছে - bash
এটি খুব ধীরে ধীরে - তবে তারা যেভাবেই করেন কেবল কাজটিই আর্গ স্ট্রিং তৈরি করে (এর 1000 কপি filename -
) প্রভাব ন্যূনতম। পারফরম্যান্সের মধ্যে পার্থক্য zsh
- উপরে হিসাবে - এবং bash
এখানে একটি সেকেন্ডের 100 তম।
এখানে অন্য সংস্করণ যা কোনও দৈর্ঘ্যের একটি ফাইলের জন্য কাজ করা উচিত:
pairs2()( [ -e "$1" ] || exit
rpt() until [ "$((n+=1))" -gt "$1" ]
do printf %s\\n "$2"
done
[ -n "${1##*/*}" ] || cd -P -- "${1%/*}" || exit
: & set -- "$1" "/tmp/pairs$!.ln" "$(wc -l <"$1")"
ln -s "$PWD/${1##*/}" "$2" || exit
n=0 rpt "$3" "$2" | xargs cat | { exec 3<&0
n=0 rpt "$3" p | sed -nf - "$2" | paste - /dev/fd/3
}; rm "$2"
)
এটি /tmp
একটি আধা-এলোমেলো নামের সাথে এটির প্রথম যুক্তিতে একটি নরম লিঙ্ক তৈরি করে যাতে এটি অদ্ভুত ফাইলের নামগুলিতে ঝুলতে না পারে। এটি গুরুত্বপূর্ণ কারণ cat
এর পাইপগুলির মাধ্যমে পাইগুলিতে আরগগুলি দেওয়া হয় xargs
। cat
এর আউটপুট সংরক্ষণ করা হবে <&3
যখন sed
p
অনেক বার হিসাবে প্রথম ARG প্রতিটি লাইন rints সেখানে যে ফাইলে লাইন আছে - এবং এর স্ক্রিপ্ট একটি নল মাধ্যমে এটি খাওয়ানো হয়। আবার এর paste
ইনপুটটিকে মার্জ করে, তবে এবার -
এটির স্ট্যান্ডার্ড ইনপুট এবং লিঙ্কটির নামের জন্য আবার মাত্র দুটি যুক্তি লাগে /dev/fd/3
।
এটি শেষ - /dev/fd/[num]
লিঙ্কটি - কোনও লিনাক্স সিস্টেমে এবং আরও অনেক কিছুতে কাজ করা উচিত, তবে যদি এটি একটি নামযুক্ত পাইপটি তৈরি করে না mkfifo
এবং পরিবর্তে এটি ব্যবহার করা উচিত।
এটি শেষ কাজটি rm
প্রস্থান করার আগে তৈরি নরম লিঙ্ক।
এই সংস্করণটি আমার সিস্টেমে প্রকৃতপক্ষে দ্রুততর । আমার ধারণা এটি এর কারণ এটি আরও বেশি অ্যাপ্লিকেশন সম্পাদন করে তবে তা অবিলম্বে তাদের তর্কগুলি তাদের হাতে তুলে দেওয়া শুরু করে - যদিও এর আগে এটি প্রথমে সমস্ত স্ট্যাক করে।
time pairs2 /tmp/tmp | wc -l
1000000
pairs2 /tmp/tmp 0.30s user 0.09s system 178% cpu 0.218 total
wc -l 0.03s user 0.02s system 26% cpu 0.218 total