সিরিজ কমান্ডের আদেশগুলি কমান্ড লাইনে কাজ করে তবে কোনও স্ক্রিপ্টে নয়


9

আমি এই এসই ডেটা ক্যোয়ারীর.csv আউটপুট নিয়ে কাজ করছি যা দেখতে এটি দেখতে (কেবল 5022 এন্ট্রি সহ):

"{
  ""id"": 281952,
  ""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
  ""id"": 281993,
  ""title"": ""Netbeans won't open in Ubuntu""
}"

(এবং এর ^M[সংখ্যা] এবং "" শিরোনাম "" এর মধ্যে লাইন শেষ রয়েছে)। এটি দেখতে এটি আমার দরকার:

281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu

আমি এটি একটি নির্দিষ্ট পাঠ্য সম্পাদককে স্থির করেছিলাম যা সহজেই নামহীন থেকে যায়, তবে আমি একটি স্ক্রিপ্ট তৈরি করতে চেয়েছিলাম যাতে প্রতিবারের ক্যোয়ারী রিফ্রেশ হওয়ার সাথে সাথে আবার এটি না করতে হয় এবং অন্যরা এটি ব্যবহার করতে পারে। আমি sed...

এই সিরিজের কমান্ডগুলি পুরোপুরি কার্যকরভাবে কাজ করে (যদিও এটি ভালভাবে অক্ষমও হতে পারে; এটি কেবলমাত্র একটি পরীক্ষামূলক-ত্রুটির সমাধান):

# Print the ^M and remove them, write to a new file:
cat -v QueryR* | sed 's/\^M//' > QueryNew
# remove all the other junk:
sed -i 's/{//' QueryNew
sed -i 's/}//' QueryNew
sed -i 's/""//g' QueryNew
sed -i 's/^"//' QueryNew
sed -i '/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}' QueryNew
sed -i 's/^\s\+//' QueryNew
sed -i '/^\s*$/d' QueryNew
sed -i 's/^id:\ //' QueryNew
sed -i 's/,\ /,/' QueryNew
sed -i 's/\\//g' QueryNew

তো, কেন এটি হয় না? কেবলমাত্র ^Mএবং {}মুছে ফেলা হবে, এবং সমস্ত কিছু এখনও আছে।

#!/bin/bash
cat -v QueryR* | sed 's/\^M//' > QueryNew
sed -i '{
       s/{//
       s/}//
       s/""//g
       s/^"//
       /,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}
       s/^\s\+//
       /^\s*$/d
       s/^id:\ //
       s/,\ /,/
       s/\\//g
}' QueryNew

আমি নিশ্চিত আমার ভুল সত্যিই সুস্পষ্ট ...

উত্তর:


11

ব্যবহার cat -vআক্ষরিক মধ্যে সি আর অক্ষর ঘুরে ^Mসিকোয়েন্স আমাকে মৌলিকভাবে কুশ্রী বলে মনে হয় - আপনি ডস লাইন শেষা w শ, ব্যবহার মুছে ফেলার জন্য প্রয়োজন হলে dos2unix, trঅথবা sed 's/\r$//'

আপনি যদি সেড ব্যবহারের জন্য জেদ করেন, তবে আমি আপনাকে সমস্ত বিড়াল বিটগুলি মুছার চেষ্টা না করে আপনার পছন্দসই বিটগুলি মুদ্রণের পরামর্শ দিচ্ছি - উদাহরণস্বরূপ

$ sed -rn -e 's/\"//g' -e 's/(.*): (.*)\r/\2/p' QueryR | paste -d '' - -
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu

আপনি অভিনবতা পেতে পারেন এবং মান ক্রমের প্রতিটি প্রান্তে শূন্য বা আরও কোট মিলিয়ে কী-মান নিষেধে উদ্ধৃতি মুছে ফেলতে পারেন

$ sed -rn 's/(.*): \"*([^"]*)\"*\r/\2/p' QueryR | paste -d '' - -
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu

আপনি পেতে পারে সত্যিই অভিনব এবং অনুকরণ করা pasteমধ্যে sedপ্রথম লাইনের জোড়া যোগদান করে ,\r$বিভক্তি এবং তারপর গুণ কী-মান জোড়া মিলে ( g) এবং অ সাগ্রহে

$ sed -rn '/,\r$/ {N; s/([^:]*): \"*([^:"]*)\"*\r\n?/\2/gp}' QueryR
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu

(ব্যক্তিগতভাবে আমি KISS পদ্ধতির পক্ষে এবং প্রথমটি ব্যবহার করব)।


এফডাব্লুআইডাব্লু, যেহেতু আপনার ইনপুটটি জেএসওন-কে অতিরিক্ত উদ্ধৃত হয়েছে বলে মনে হচ্ছে, আমি উপযুক্ত JSON পার্সার ইনস্টল করার পরামর্শ দিচ্ছি যেমন jq

sudo apt-get install jq

তারপরে আপনি এর মতো কিছু করতে পারেন

$ sed -e 's/["]["]/"/g' -e 's/"{/{/' -e 's/}"/}/' QueryR | jq '.id, .title' | paste -d, - -
281952,"Flash 11.2 No Longer Supported by Google Play"
281993,"Netbeans won't open in Ubuntu"

যা অতিরিক্ত অতিরিক্ত উক্তিগুলি সরিয়ে দেয় এবং তারপরে jqআগ্রহের ক্ষেত্রগুলি নিষ্কাশন করতে ব্যবহার করে - নোট যা jqডস-স্টাইলের লাইন শেষগুলি পরিচালনা করে বলে মনে হয়, সুতরাং সেগুলি সরাতে বিশেষ পদক্ষেপ গ্রহণ করার দরকার নেই।

jq '.[]'সমস্ত অ্যাট্রিবিউট-মান জোড়া ডাম্প করতে পরিবর্তন করুন ।

গ্রিপ-ও-র মাধ্যমে নতুন লাইনে কাটিয়ে ওঠাjq থেকে নেওয়া অনুপ্রেরণা এবং বেসিক সিনট্যাক্সের ক্রেডিট


1
হ্যাঁ, আমি কেন ভুলে গেছি \rjqপ্রথম লাইনে যেখানে শিরোনাম ক্ষেত্রটি একটি কোলন ছিল (প্রথম লাইন) broke আমি এখনও নিশ্চিত কেন নই sedআমাকে ঘৃণা করে, কিন্তু আমি কোট কিছু হত্যা করে এবং \rএই লাইনে /,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}এবং পরিশেষে এটা মত কাজ করে এই । অনেক অনেক ধন্যবাদ ^ _ ^
জান্না

1
এটি অনেক ভাল (তবে আমি sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
যাদুগুলির

5

আমি এটি স্টিল্ড্রাইভার এবং আরও টিঙ্কারিংয়ের জন্য ধন্যবাদ স্থির করেছি। অপরিশোধিত তবে কাজ করে।

sed  '{
       s/"{//
       s/}"//
       s/^"//
       /,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,/}}
       s/""//g
       s/^\s\+//
       /^\s*$/d
       s/^id:\ //
       s/\\//g
}' QueryR* | tee "$1"

অনুবাদ:
s/"{//সরান "{
s/}"//অপসারণ }"
s/^"//সরান "লাইন শুরু থেকে
/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}ম্যাচের ,\rএক লাইনে এবং [whatever]title[whatever]:পরের লাইনে উপর, সমস্ত প্রতিস্থাপন যে সঙ্গে ,
s/""//gমুছে ফেলুন সব অবশিষ্ট ডবল উদ্ধৃতি চিহ্ন
s/^\s\+//লাইনের শুরু থেকে সরান হোয়াইটস্পেস
/^\s*$/dসরান খালি লাইন
s/^id:\ //সরান id:এবং স্থান পর
s/\\//gজন্য (পালাবার অক্ষর ব্যাকস্ল্যাশ সরান "কিছু শিরোনাম ক্ষেত্রে যোগ করা হয়েছে)
tee "$1"উদাহরণস্বরূপ, স্ক্রিপ্টটি চালানোর সময় একটি আউটফিল নির্দিষ্ট করুন./queryclean newquery.csv


4

প্রশ্নটি জিজ্ঞাসা করার সময় sed, পাইথনের সাথে কেউ সেডের সমস্যাগুলি নিয়ে কাজ করতে পারে:

from __future__ import print_function
import sys

with open(sys.argv[1]) as f:
     for line in f:
         if '""id""' in line:
            print(line.strip().split(':')[1],end="")
         if '""title""' in line:
            title = " ".join(line.strip().split(':')[1:])
            print(title.replace('""'," "))

এই কোডটি পাইথন 2 এবং পাইথন 3 উভয়ের সাথে সম্মতিযুক্ত, সুতরাং হয় কাজ করবে

নমুনা রান:

bash-4.3$ cat questions.txt 
"{
  ""id"": 281952,
  ""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
  ""id"": 281993,
  ""title"": ""Netbeans won't open in Ubuntu""
}"
bash-4.3$ python3 parse_questions.py questions.txt 
 281952,  Flash 11.2 No Longer Supported by Google Play 
 281993,  Netbeans won't open in Ubuntu 

4

আরও তিনটি পন্থা:

  1. awk

    $ awk -F'": ' '/\"id\"/{id=$NF;} 
                  /\"title\"/{
                    t=$NF; 
                    sub(/^""/,"",t); 
                    sub(/""$/,"",t); 
                    print id,t
                  }' OFS="" file 
    281952,Flash 11.2 No Longer Supported by Google Play
    281993,Netbeans won't open in Ubuntu
  2. পার্ল

    $ perl -lne '$id=$1 if /id"":\s*(\d+)/; 
                 if(/title"":\s*""(.*)""/){print "$id,$1"}' file 
    281952,Flash 11.2 No Longer Supported by Google Play
    281993,Netbeans won't open in Ubuntu
  3. পার্ল সামঞ্জস্যপূর্ণ regexes এবং সাধারণ পার্ল সহ GNU গ্রেপ:

    $ grep -oP '(id"":\s*\K.*)|(title"":\s*""\K.*(?=""))' file | 
        perl -pe 'chomp if $.%2'
    281952,Flash 11.2 No Longer Supported by Google Play
    281993,Netbeans won't open in Ubuntu

4

এটি আপনার প্রশ্নের সঠিক উত্তর দিচ্ছে না বা আপনার সমস্যার সমাধান করছে না, তবে অবাঞ্ছিত চরিত্রগুলি থেকে মুক্তি পেতে আপনি ট্র ব্যবহার করতে পারেন :

cat QueryR | tr -d '}{:"' 

এবং আপনি পাবেন:

এখানে চিত্র বিবরণ লিখুন


ধন্যবাদ, আমার ব্যবহার শিখতে হবে tr:)
Zanna

এটি সেড বা অ্যাজকের মতো শক্তিশালী নয় তবে এ জাতীয় জিনিসগুলির জন্য এটি খুব সোজা। চিয়ার্স :)
কেসিডিটিভি

1

এটি রুবিতে লেখা অন্য লিপি। এটি শিরোনামে কমাগুলি ধরে রাখবে, যা কলামগুলি না ভেঙে সহজেই কোনও স্প্রেডশিট প্রোগ্রামে আমদানি করা যায়।

csvfile = File.open('query-fixed.csv', 'w')

File.open('QueryResults2.csv') do |f|
    content = f.read
    content.gsub!(/\r\n?/, "\n")
    content.each_line do |line|
        id, title = '', ''
        if line.match('\"id\"')
            id = line.split(':')[1].strip[0..-2]
            csvfile.write(id + ',')
        end
        if line.match('\"title\"')
            title = line.partition(':')[2].scan(/"(.*)"/)[0][0]
            csvfile.write(title + "\n")
        end
    end
end

প্রোগ্রামটি চালুর পরে উত্পাদিত আউটপুট এগুলির মতো দেখাবে

281952,"Flash 11.2 No Longer Supported by Google Play"
281993,"Netbeans won't open in Ubuntu"

এটি খুব সুন্দর :)
Zanna

:তাদের ভিতরে শিরোনাম সম্পর্কে ?
Sнаđошƒаӽ

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