स्ट्रिंग और पहले शब्द से युक्त प्रिंट शब्द


10

मैं पाठ की एक पंक्ति में एक स्ट्रिंग ढूंढना चाहता हूं और स्ट्रिंग (रिक्त स्थान के बीच) और वाक्यांश का पहला शब्द प्रिंट करना चाहता हूं।

उदाहरण के लिए:

"यह एक एकल पाठ पंक्ति है"
"एक और बात"
"यह बेहतर है कि आप फिर से कोशिश करें"
"बेहतर"

तार की सूची है:

टेक्स्ट
चीज़
प्रयत्न
बेहतर

मैं जो कोशिश कर रहा हूं वह इस तरह से एक तालिका प्राप्त करना है:

यह [टैब] पाठ
एक और [टैब] बात
यह [टैब] प्रयास करें
बेहतर

मैंने grep के साथ प्रयास किया लेकिन कुछ नहीं हुआ। कोई उपाय?


तो, मूल रूप से "यदि लाइन में स्ट्रिंग है, तो पहले शब्द + स्ट्रिंग प्रिंट करें"। सही ?
सर्गी कोलोडियाज़नी

जवाबों:


12

बैश / grep संस्करण:

#!/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

उपरोक्त का परीक्षण GNU sed पर किया गया (जिसे gsedOSX कहा जाता है)। BSD sed के लिए, कुछ छोटे बदलावों की आवश्यकता हो सकती है।

यह काम किस प्रकार करता है

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

    यह एक शब्द के लिए दिखता है [[:alnum:]]+, उसके बाद एक स्थान, [[:space:]]और उसके बाद कुछ भी .*, उसके बाद आपका एक शब्द text|thing|try|Better, उसके बाद कुछ भी। यदि यह पाया जाता है, तो इसे लाइन पर पहले शब्द (यदि कोई हो), एक टैब और मिलान किए गए शब्द से बदल दिया जाता है।

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

    यदि प्रतिस्थापन कमांड के परिणामस्वरूप प्रतिस्थापन होता है, जिसका अर्थ है कि आपका एक शब्द लाइन पर पाया गया था, तो taकमांड लेबल पर कूदने के लिए sed को बताता है a। यदि नहीं, तो हम bअगली पंक्ति में शाखा ( ) करते हैं। :aलेबल को परिभाषित करता है a। इसलिए, यदि आपका एक शब्द पाया गया था, तो हम (ए) प्रतिस्थापन करते हैं s/^\t//जो एक अग्रणी टैब को हटाता है यदि एक है, और (बी) प्रिंट ( p) लाइन है।


7

एक साधारण बैश / sed दृष्टिकोण:

$ 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), और लाइन प्रिंट (क्या है कि pमें s///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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.