কমান্ড আউটপুট থেকে দ্বিতীয় কলামটি কীভাবে পাবেন?


152

আমার কমান্ডের আউটপুট এরকম কিছু:

1540 "A B"
   6 "C"
 119 "D"

প্রথম কলামটি সর্বদা একটি সংখ্যা হয় তার পরে একটি স্থান থাকে তারপরে একটি ডাবল-কোটেড স্ট্রিং থাকে।

আমার উদ্দেশ্যটি কেবল দ্বিতীয় কলামটি পাওয়া, যেমন:

"A B"
"C"
"D"

আমি <some_command> | awk '{print $2}'এটি সম্পাদন করতে ব্যবহার করার ইচ্ছা ছিল । তবে প্রশ্নটি হ'ল, দ্বিতীয় কলামের কিছু মানগুলিতে স্থান (গুলি) রয়েছে যা awkক্ষেত্রগুলি পৃথক করার জন্য পূর্বনির্ধারিত সীমানা হিসাবে ঘটে । অতএব, আউটপুট গণ্ডগোল হয়:

"A
"C"
"D"

আমি কীভাবে দ্বিতীয় কলামটির মান (জোড়যুক্ত উক্তি সহ) পরিষ্কারভাবে পাব?



1
আমি ব্যবহার করার চেষ্টা করেছি awk '{$1=""; print $0}', তবে এটির মধ্যে এখনও একটি শ্বেত স্থানের অক্ষর রয়েছে। এটি দ্বারা সরানো যেতে পারে sed '/^ //'। তবুও, এটি দিয়ে awkকি করা যায় ?
কিয়াং শু

উত্তর:


29

অথবা সেড ও রেজেেক্স ব্যবহার করুন।

<some_command> | sed 's/^.* \(".*"$\)/\1/'

আপনার আরম্ভ এবং শেষের চিহ্নিতকারীগুলির প্রয়োজন না হওয়ায় ছোট সেন্টিমিটার করুন:<some_command> | sed 's/.* \(".*"\)/\1/'
টিমো

197

-F [field separator]এসগুলিতে লাইনগুলি বিভক্ত করতে ব্যবহার করুন ":

awk -F '"' '{print $2}' your_input_file

বা পাইপ থেকে ইনপুট জন্য

<some_command> | awk -F '"' '{print $2}'

আউটপুট:

A B
C
D

3
এটি ভাল তবে মূল আশেপাশের উদ্ধৃতিগুলিও চাই। এটা করা যেতে পারে? ধন্যবাদ।
কিয়াং শু

5
আপনি প্রতারণা করতে পারেন, এবং awk এর মুদ্রণটি এতে পরিবর্তন করতে পারেন'{print "\""$2"\""}'
অ্যালেক্স

হ্যাঁ, এটি কাজ করে। অনেক ধন্যবাদ, অ্যালেক্স! যাইহোক, এতগুলি উদ্ধৃতি, :)
কিয়াং শু

@ অ্যালেক্স, আপনি কীভাবে ডাবল উদ্ধৃতি চিহ্ন এবং ব্যাকস্ল্যাশ ব্যবহার করেছেন বিকল্পটি চাইলে তা ব্যাখ্যা করতে পারেন।
টিমো

1
@ টিমো কোটস এবং ব্যাকস্ল্যাশ ব্রেকডাউন হিসাবে কল্পনা করা যেতে পারে "\"" + $2 + "\""। আশেপাশের উদ্ধৃতি চিহ্নগুলি আউটপুটটিতে যুক্ত হওয়ার জন্য কিছু নির্দেশ করছে এবং পালানো উদ্ধৃতি চিহ্ন ( \") মুদ্রিত হচ্ছে। সাহায্যের এটা ঠাহর করতে, এই এটা কিসের মত যদি আমরা ফাঁকা স্পেস প্রায় যোগ করতে চেয়েছিলেন দেখাবে হয় $2উদ্ধৃতি চিহ্ন পরিবর্তে: '{print " "$2" "}'। এটিকে ছাঁটাই করা আরও সহজ করার জন্য আমরা ফর্ম্যাট স্পেসিংও যুক্ত করতে পারি:'{print " " $2 " "}'
টম

80

আপনি যদি 'অ্যাডক' ব্যতীত অন্য কিছু ব্যবহার করতে পারেন তবে তার পরিবর্তে এটি ব্যবহার করে দেখুন

echo '1540 "A B"' | cut -d' ' -f2-

-d একটি বিভেদক হল -f কাটা করতে ক্ষেত্র এবং -f2- আমরা শেষ পর্যন্ত 2nd ক্ষেত্র কাটা মনস্থ।


এটি আমাকে নিম্নলিখিতগুলি করার চেষ্টা করতে সহায়তা করেছে (গিটের মধ্যে একটি ফাইলের প্রতিশ্রুতি আইডি আনুন): গিট এনোটেট মাইফাইল.cpp | গ্রেপ '2016-07' | মাথা -1 | কাট
-ফ 1

2
এটি ভাল, তবে ডিলিমিটার একাধিক চরিত্রের দীর্ঘ হলে কাজ করে না। সেখানেই
আজকের

2
কেন একটি স্থান পরে ব্যবহার করা হয় না -d? এটিকে কিছুটা অদ্ভুত দেখাচ্ছে।
ক্রিস স্ট্রাইজাইস্কি

43

কমান্ড আউটপুট "ডকার ইমেজ" থেকে একটি নির্দিষ্ট কলাম পাওয়ার জন্য এটি কাজ করা উচিত:

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

এটি তৃতীয় কলামটি মুদ্রণ করতে চলেছে


আপনি কি ডকারের চিত্র রেখেছেন? awk '{5} মুদ্রণ?
শশী রঞ্জন

17

এর জন্য আপনাকে বিশ্রী লাগবে না। readব্যাশ শেল ব্যবহার করা যথেষ্ট হওয়া উচিত, যেমন

some_command | while read c1 c2; do echo $c2; done

বা:

while read c1 c2; do echo $c2; done < in.txt

13

আপনার যদি জিএনইউ অ্যাড থাকে তবে এটি আপনার সমাধানটি চান:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"


0
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

তারপরে, ধরুন আপনি স্ক্রিপ্টটির নাম সহ হিসাবে রেখেছেন, বলুন, আকারের ফাইলগুলি পাওয়ার জন্য এই জাতীয় কিছু করুন (উদাহরণস্বরূপ ধরে নেওয়া হয় আপনি লিনাক্স ব্যবহার করছেন তবে লিপিটি নিজেই ওএস-স্বতন্ত্র): -

ls -lh | co 5

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