কোনও পাঠ্য ফাইল থেকে শব্দের তালিকার সমস্ত উপস্থিতি কীভাবে মুছবেন?


6

আমার কাছে শব্দের একটি তালিকা রয়েছে এমন একটি ফাইল রয়েছে। আমি এই ফাইলের সমস্ত শব্দের সমস্ত উপস্থিতি একটি বড় টেক্সট ফাইল থেকে সরাতে চাই।

উদাহরণ:

ফাইল 1

queen
king

পাঠ্য ফাইলের নমুনা

Both the king and queen are monarchs. Will the queen live? Queen, it is!

এটি আমি চেষ্টা করেছি:

sed -i 's/queen/ /g' page.txt
sed -i 's/Queen/ /g' page.txt

আউটপুট

Both the and are monarchs. Will the live? , it is!

আমার কাছে থাকা শব্দের তালিকাটি বড় (50000 শব্দের বেশি)। কমান্ড লাইনে প্যাটার্ন নির্দিষ্ট না করে আমি কীভাবে এটি করতে পারি?


সুতরাং আপনার এটি হওয়া দরকার i) কেস সংবেদনশীল এবং ii) বিরামচিহ্ন ( queen,ম্যাচ queen) উপেক্ষা করবেন ? সাবস্ট্রিংস সম্পর্কে কীভাবে? করা উচিত kingমেলে hiking? নাকি high-king?
টেরডন

1
আপনি এ পর্যন্ত কি কি? কোথায় আটকে গেলেন? আপনি যদি শুরু করে থাকেন তবে unix.stackexchange.com/q/112023/135943 দেখুন । ( কিছু প্রচেষ্টা দেখান এবং আপনার সাহায্য পাওয়ার সম্ভাবনা বেশি থাকে; ইতিমধ্যে খুব সহজেই অনুসন্ধানযোগ্য এই সাইটে প্রচুর পরিমাণে তথ্য রয়েছে))
ওয়াইল্ডকার্ড

@terdon পুরো স্ট্রিং ম্যাচ। বিরামচিহ্ন উপেক্ষা করা হয়।
ব্যবহারকারীর 10327

@ উইল্ডকার্ড কমান্ড লাইনে নির্দিষ্ট করা একটি শব্দের সমস্ত উপস্থিতি সরাতে আমি সেড ব্যবহার করতে সক্ষম হয়েছি। আমি নিশ্চিত না যে কীভাবে এটি করতে হবে যদি একাধিক শব্দ থাকে তবে কোনও ফাইল থেকে পড়তে হবে।
ব্যবহারকারী110327

1
চমৎকার। দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন এবং আপনি যে আদেশটি ব্যবহার করেছেন সেটি যোগ করুন এবং কীভাবে এটি এক্ষেত্রে ব্যর্থ হয়।
টেরডন

উত্তর:


5

আপনার প্রকৃত ব্যবহারের ক্ষেত্রে আমি পার্ল ব্যবহার করে টেরডনের উত্তরের পরামর্শ দিচ্ছি

তবে, সরল সংস্করণটি, যা অন্য শব্দের সাবস্ট্রিংগুলি ব্যবহার করে শব্দগুলি পরিচালনা না করে (উদাহরণস্বরূপ "হাইকিং" থেকে "কিং" মুছে ফেলা হয়), আপনার আসল ফাইলে ভিন্ন শেড উদাহরণ দ্বারা চালিত কমান্ডটি তৈরি করতে একটি সেড কমান্ড ব্যবহার করা হয়

এই ক্ষেত্রে, wordfile"কিং" এবং "কুইন" রয়েছে এবং textfileআপনার পাঠ্য রয়েছে:

sed -e "$(sed 's:.*:s/&//ig:' wordfile)" textfile

মনে রাখবেন যে " iগনোর কেস" পতাকাটি একটি জিএনইউ এক্সটেনশন, মান নয়।


2
এই sedসমস্যার সমাধান ওয়েবে খুব কমই পাওয়া যায়। - সোনার ধুলা খুঁজে পাওয়ার মতো মনে হচ্ছে…
সার্জ স্ট্রোব্যান্ড ডেস্ক

3

সহজ তবে অদক্ষ উপায় হ'ল প্রতিটি ইনপুট শব্দের জন্য একবারে একাধিকবার ফাইলটি প্রক্রিয়া করা:

$ while read w; do sed -i "s/$w//ig" file2 ; done < file1
$ cat file2
Both the  and  are monarchs. Will the  live? , it is!

এটি বড় ফাইলগুলির জন্য খুব ধীর হতে পারে যদিও (এবং এটি সাবস্ট্রিংয়ের সাথেও মেলে)। পার্লের সাথে আপনি একক পাসে এটি করতে পারেন:

perl -lpe 'BEGIN{open(A,"file1"); chomp(@k = <A>)} 
                 for $w (@k){s/\b\Q$w\E\b//ig}' file2 

\bনিশ্চিত আমরা কেবল শব্দ সীমানা উপর মেলে, মেক \Q\Eনিশ্চিত $wআক্ষরিক নেওয়া হয়। এটি স্ক্রিপ্টটি hikingম্যাচ করা থেকে বিরত রাখবে তবে এটি মিলবে high-king। এটি এড়ানোর জন্য, আপনাকে স্পষ্টরূপে একটি শব্দ সংজ্ঞা দেয় এমন অক্ষরগুলি তালিকাবদ্ধ করতে হবে:

perl -Mopen=locale -Mutf8 -lpe '
  BEGIN{open(A,"file1"); chomp(@k = <A>)} 
  for $w (@k){s/(^|[ ,.—_;-])\Q$w\E([ ,.—_;-]|$)/$1$2/ig}' file2 

যে নন- ASCII অক্ষর সর্বোপরি, UTF-8 এনকোডিং মধ্যে প্রবেশ করতে হবে, যেমন আমরা বলছ দরকার perlকোডের মাধ্যমে হল UTF-8 লেখা আছে -Mutf8। আমরা -Mopen=localeফাইলগুলির সামগ্রী এবং স্টডআউটকে লোকেলের অক্ষর সেটটিতে ডিকোড / এনকোড করার জন্য ব্যবহার করছি ।


0

এই স্ক্রিপ্টটি ফাইলটিতে সংরক্ষণ করুন d: ( গিথব গিস্ট থেকে ডাউনলোড করুন )

#!/bin/bash

LIST=${1:?"LIST word"}
FILE=${2:?"FILE name not set"}

L=$( sed -e ':a;N;$!ba;s_\n_\x00_g' ${LIST}|sed -e 's_\x00_ \\|_g' -e's_\(\\|\)*$__g')
P='s_\('$L'\)__ig'
O="sed -e '$P'  ${FILE}"

eval "${O}"

তারপরে এটি চালান:

bash ./d LIST FILE 

আপনি যদি ফাইল সংরক্ষণ করতে চান তবে আপনি এই আদেশটি চালাতে পারেন:

bash ./d LIST FILE  | tee NewFILE

অথবা

bash ./d LIST FILE > NewFile

আপনার আমি তালিকায় বাক্য পড়ার এবং foramt Regex, উদাহরণস্বরূপ আমি পরিবর্তন এটি পরিবর্তন queenএবং kingএবং testএই ফর্ম্যাটে:

queen\|king\|test

তারপরে sedএই পরামিতি দিয়ে কমান্ড তৈরি করুন :

sed -e 's_\(queen\|king\|test\) *__ig' FILE

এই বাশ স্ক্রিপ্টটি সহ আমরা একবার LISTWORDএবং একবার FILEপ্রতিস্থাপনের জন্য পড়ি

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