टेक्स्ट फ़ाइल से कॉलम 2 को काटें


15

मेरी पाठ फ़ाइल में विभाजक को निर्दिष्ट करने के लिए कोई सीमांकक नहीं है, मैं आउटपुट फ़ाइल में कॉलम 2 को कैसे काटूं,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

इसलिए आउटपुट मुझे चाहिए

207
412
432

जवाबों:


13

यह सबसे आसान है awkजिसके साथ कई लगातार रिक्त स्थान को एक ही माना जाता है, इसलिए

awk '{print $2}' file

प्रिंट

207
412
431

लेकिन जाहिर है कि कई, कई अन्य उपकरण हैं जो काम करेंगे, यहां तक ​​कि इस तरह के कार्य के लिए डिज़ाइन नहीं किया गया है grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

अपने डेटा (जैसे, cat column.txt) को कट में भेजने के लिए पाइप का उपयोग करें।

cat columns.txt | cut -d" " -f5

आपके द्वारा प्रदान किए गए उदाहरण डेटा में, एक एकल स्थान सीमांकक आपके द्वारा फ़ील्ड में इच्छित डेटा डालता है। उस आउटपुट को किसी अन्य फ़ाइल में पुनर्निर्देशन का उपयोग करने के लिए भेजता है।

cat collumns.txt | cut -d" " -f5 > field2.txt

Awk कमांड का उपयोग करके आप नीचे जैसा कुछ कर सकते हैं जो आपके द्वारा फ़ील्ड के बाद स्वचालित रूप से पहचाने जाने के कारण होता है क्योंकि वहां डेटा (?) है, मुझे awk के बारे में अधिक जानने की आवश्यकता है।

awk -F' ' '{print $2}' columns.txt

3
अधीरता cat ... |शायद ही कभी आवश्यक है। अधिकांश यूनिक्स कमांड cutएक या एक से अधिक इनपुट फाइल को तर्क के रूप में लेते हैं, जैसे cut -d" " -f5 columns.txt
डेनिस होवे

1

जैसा कि @jimmij ने कहा, awk '{print $2}' fileसबसे सरल उत्तर है।

यदि किसी कारण से, आप उपयोग नहीं करना चाहते हैं awkऔर उपयोग करने पर जोर देते हैं cut, तो आप कट में पाइपिंग करने से पहले sedदो या अधिक स्थानों के प्रत्येक उदाहरण को एक टैब ( cut'डिफ़ॉल्ट डिमाइटर) में बदलने के लिए उपयोग कर सकते हैं :

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

आप अभी भी अपने रिक्त स्थान के रूप में सिंगल स्पेस का उपयोग कर सकते हैं, आपके पास बस अधिक कॉलम होंगे। वह मान बढ़ाएं जो आप cut -d' ' -f2 से 5 तक देते हैं, या हो सकता है कि 6. वांछित परिणाम प्राप्त होने तक संख्या बढ़ाएँ ।


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

यदि डेटा निष्कर्षण के लिए awk जैसी लिनक्स उपयोगिताएँ काम नहीं करतीं तो ऊपर एक बहुत उपयोगी है यदि आप शेल स्क्रिप्ट के अंदर "रूट" उपयोगकर्ता को बदल रहे हैं जैसे कि नीचे:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
awkआपके उदाहरण में "काम नहीं करेगा " एकमात्र कारण यह है कि यहां-दस्तावेज़ को अयोग्य घोषित किया गया है, जिसका अर्थ $2है कि शेल द्वारा दूसरे स्थितीय पैरामीटर में विस्तारित किया जाएगा। समाधान शायद स्विच करने के लिए एक के लिए नहीं है grepआदेश लेकिन या तो करने के लिए भागने $में $2के रूप में \$2या बस का उपयोग करके पूरे दस्तावेज़ उद्धृत करने <<'EOF'के स्थान पर <<EOF। यह भी ध्यान दें कि आपके उदाहरण में कार्य अधिक सरलता से किया गया है pgrep
कुसलानंद

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