कमांड आउटपुट से दूसरा कॉलम कैसे प्राप्त करें?


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?
Qiang जू

जवाबों:


29

या sed & regex का उपयोग करें।

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

छोटे cmd के रूप में आप शुरू और अंत मार्करों की जरूरत नहीं है:<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
@Timo उद्धरण और बैकस्लैश ब्रेकडाउन के रूप में कल्पना की जा सकती है "\"" + $2 + "\""। आसपास के उद्धरण चिह्नों से संकेत मिलता है कि कुछ आउटपुट में जोड़ा जा सकता है, और बची हुई अवतरण चिह्न ( \") मुद्रित की जा रही है। इसकी कल्पना करने में मदद करने के लिए, यह ऐसा लगेगा जैसे अगर हम $2उद्धरण चिह्नों के बजाय रिक्त स्थान जोड़ना चाहते हैं '{print " "$2" "}':। हम स्वरूपण रिक्ति को जोड़ने के लिए इसे थोड़ा आसान बनाने के लिए जोड़ सकते हैं:'{print " " $2 " "}'
टॉम

80

यदि आप 'awk' के अलावा किसी और चीज का उपयोग कर सकते हैं, तो इसके बजाय यह प्रयास करें

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

-d एक सीमांकक है, -f काटने के लिए क्षेत्र है और -f2- हम अंत तक 2 क्षेत्र में कटौती करने का इरादा रखते हैं।


इससे मुझे निम्नलिखित करने की कोशिश करने में मदद मिली (git में एक फ़ाइल की id id लाने के लिए): git annotate myfile.cpp | grep '2016-07' | सिर -1 | cut -f1
सर्प

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.