স্ট্রিং এবং প্রথম শব্দযুক্ত শব্দটি মুদ্রণ করুন


10

আমি পাঠ্যের একটি লাইনে একটি স্ট্রিং সন্ধান করতে চাই এবং স্ট্রিংটি (স্পেসগুলির মধ্যে) এবং বাক্যাংশটির প্রথম শব্দটি মুদ্রণ করতে চাই।

উদাহরণ স্বরূপ:

"এটি একক পাঠ্য রেখা"
"আরেকটি বিষয়"
"আপনি আবার চেষ্টা করুন ভাল"
"উত্তম"

স্ট্রিংগুলির তালিকাটি হ'ল:

পাঠ
জিনিস
চেষ্টা
উত্তম

আমি যা চেষ্টা করছি তা হ'ল এটির মতো একটি টেবিল পাওয়া:

এই [ট্যাব] পাঠ্য
আর একটি [ট্যাব] জিনিস
এটি [ট্যাব] চেষ্টা করুন
উত্তম

আমি গ্রিপ দিয়ে চেষ্টা করেছি কিন্তু কিছুই ঘটেনি। যেকোনো পরামর্শ?


সুতরাং, মূলত "যদি লাইনের স্ট্রিং থাকে তবে প্রথম শব্দ + স্ট্রিংটি মুদ্রণ করুন"। ঠিক?
সের্গেই কোলোডিয়াজনি

উত্তর:


12

বাশ / গ্রেপ সংস্করণ:

#!/bin/bash
# string-and-first-word.sh
# Finds a string and the first word of the line that contains that string.

text_file="$1"
shift

for string; do
    # Find string in file. Process output one line at a time.
    grep "$string" "$text_file" | 
        while read -r line
    do
        # Get the first word of the line.
        first_word="${line%% *}"
        # Remove special characters from the first word.
        first_word="${first_word//[^[:alnum:]]/}"

        # If the first word is the same as the string, don't print it twice.
        if [[ "$string" != "$first_word" ]]; then
            echo -ne "$first_word\t"
        fi

        echo "$string"
    done
done

এটি যেমন কল:

./string-and-first-word.sh /path/to/file text thing try Better

আউটপুট:

This    text
Another thing
It  try
Better

9

পার্ল উদ্ধার!

#!/usr/bin/perl
use warnings;
use strict;

my $file = shift;
my $regex = join '|', map quotemeta, @ARGV;
$regex = qr/\b($regex)\b/;

open my $IN, '<', $file or die "$file: $!";
while (<$IN>) {
    if (my ($match) = /$regex/) {
        print my ($first) = /^\S+/g;
        if ($match ne $first) {
            print "\t$match";
        }
        print "\n";
    }
}

হিসাবে সংরক্ষণ করুন, হিসাবে first-plus-wordচালান

perl first-plus-word file.txt text thing try Better

এটি ইনপুট শব্দগুলি থেকে একটি রেজেক্স তৈরি করে। এরপরে প্রতিটি লাইনটি রেজেক্সের সাথে মিলে যায়, এবং যদি কোনও মিল থাকে তবে প্রথম শব্দটি মুদ্রিত হয় এবং শব্দটির থেকে আলাদা থাকলে শব্দটিও মুদ্রিত হয়।


9

এখানে একটি দারুণ সংস্করণ:

awk '
  NR==FNR {a[$0]++; next;} 
  {
    gsub(/"/,"",$0);
    for (i=1; i<=NF; i++)
      if ($i in a) printf "%s\n", i==1? $i : $1"\t"$i;
  }
  ' file2 file1

file2শব্দের তালিকাটি কোথায় এবং file1বাক্যাংশগুলি রয়েছে।


2
ভাল একটা! আমি একটি স্ক্রিপ্ট ফাইল, সেটিকে রেখেছি paste.ubuntu.com/23063130 শুধু সুবিধার জন্য
Sergiy Kolodyazhnyy

8

এখানে অজগর সংস্করণ:

#!/usr/bin/env python
from __future__ import print_function 
import sys

# List of strings that you want
# to search in the file. Change it
# as you fit necessary. Remember commas
strings = [
          'text', 'thing',
          'try', 'Better'
          ]


with open(sys.argv[1]) as input_file:
    for line in input_file:
        for string in strings:
            if string in line:
               words = line.strip().split()
               print(words[0],end="")
               if len(words) > 1:
                   print("\t",string)
               else:
                   print("")

ডেমো:

$> cat input_file.txt                                                          
This is a single text line
Another thing
It is better you try again
Better
$> python ./initial_word.py input_file.txt                                      
This    text
Another     thing
It  try
Better

সাইড নোট : স্ক্রিপ্ট হয় python3, সামঞ্জস্যপূর্ণ যাতে আপনি এটা হয় সঙ্গে চালাতে পারেন python2বা python3


7

এটা চেষ্টা কর:

$ sed -En 's/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/p' File
This    text
Another thing
It      try
        Better

যদি ট্যাবটি Betterসমস্যা হওয়ার আগে থাকে তবে এটি ব্যবহার করে দেখুন:

$ sed -En 's/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/; ta; b; :a; s/^\t//; p' File
This    text
Another thing
It      try
Better

উপরেরটি জিএনইউ সেডে পরীক্ষা করা হয়েছিল ( gsedওএসএক্সে কল করা)। বিএসডি সেডের জন্য কিছু ছোটখাটো পরিবর্তন প্রয়োজন হতে পারে।

কিভাবে এটা কাজ করে

  • s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/

    এটি কোনও শব্দের সন্ধান করে, তার [[:alnum:]]+পরে কোনও স্থান [[:space:]], তারপরে কিছু .*, তারপরে আপনার একটি শব্দের পরে, text|thing|try|Betterকোনও কিছু অনুসরণ করে। যদি এটি পাওয়া যায় তবে এটি লাইনটির প্রথম শব্দের সাথে (যদি থাকে) একটি ট্যাব, এবং মিলিত শব্দ দিয়ে প্রতিস্থাপিত হয়।

  • ta; b; :a; s/^\t//; p

    যদি সাবস্টিটিউশন কমান্ডের পরিবর্তে প্রতিস্থাপনের ফলাফল হয়, যার অর্থ আপনার একটি শব্দ লাইনে পাওয়া গেছে, তবে taকমান্ডটি সেডকে লেবেলে লাফিয়ে যেতে বলে a। যদি না হয়, তবে আমরা bপরবর্তী লাইনে শাখা ( ) করব। :aলেবেল সংজ্ঞা দেয় সুতরাং, যদি আপনার কোনও একটি শব্দ পাওয়া যায়, আমরা (ক) বিকল্পটি করব s/^\t//যা একটি নেতৃস্থানীয় ট্যাব সরিয়ে দিলে, এবং (খ) pলাইনটি মুদ্রণ করবে।


7

একটি সরল বাশ / সেড পদ্ধতির:

$ while read w; do sed -nE "s/\"(\S*).*$w.*/\1\t$w/p" file; done < words 
This    text
Another thing
It  try
    Better

while read w; do ...; done < wordsফাইলের প্রতিটি লাইন পুনরুক্তি হবে wordsএবং এটি সংরক্ষণ $w-nতোলে sedডিফল্টরূপে কিছু মুদ্রণ করতে। এর পরে sedকমান্ডটি ডাবল কোটগুলির পরিবর্তে শ্বেতক্ষেত্রের স্থান পরিবর্তন করবে ( প্রথম \"(\S*)বন্ধুর সাথে \S*প্রথম শব্দের সাথে প্রথম মিলিত শব্দটি "ক্যাপচার" করে এবং আমরা পরে এটি উল্লেখ করতে পারি \1), 0 বা আরও অক্ষর ( .*) এবং তারপরে শব্দটি আমরা ( $w) এবং আবার 0 বা আরও বেশি অক্ষর খুঁজছি ( .*)। এই ম্যাচ, তাহলে আমরা এটি শুধুমাত্র 1 ম শব্দ, একটি ট্যাব এবং প্রতিস্থাপন $w( \1\t$w), এবং লাইন মুদ্রণ (কী যে ps///pনা)।


5

এটি রুবি সংস্করণ

str_list = ['text', 'thing', 'try', 'Better']

File.open(ARGV[0]) do |f|
  lines = f.readlines
  lines.each_with_index do |l, idx|
    if l.match(str_list[idx])
      l = l.split(' ')
      if l.length == 1
        puts l[0]
      else
        puts l[0] + "\t" + str_list[idx]
      end
    end
  end
end

নমুনা পাঠ্য ফাইল hello.txtরয়েছে

This is a single text line
Another thing
It is better you try again
Better

ruby source.rb hello.txtফলাফল নিয়ে চলছে

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