অ্যাজকি ব্যবহার করে কোনও নির্দিষ্ট সংখ্যার পরে সমস্ত কলাম কীভাবে মুদ্রণ করবেন?


90

শেলটিতে, যখন আমার কোনও নির্দিষ্ট কলামের প্রয়োজন হবে তখন আমি আঁতকে উঠি pipe

এটি কলাম 9 প্রিন্ট করে, উদাহরণস্বরূপ:

... | awk '{print $9}'

আমি কীভাবে ডাব্লাকে কলাম 9 সহ কলাম 9 সহ এবং তার পরে সমস্ত কলাম মুদ্রণ করতে বলতে পারি ?


উত্তর:


83
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'

4
সামান্য পরিমার্জন একটি দম্পতি:awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
গ্লেন জ্যাকম্যান

ধন্যবাদ @ আইলেন, এটি প্রকৃতপক্ষে কিছুটা সাধারণ। যাই হোক - আমি স্পষ্টভাবে সম্মত চাই এটি ব্যবহার করতে ভালো হতে চাই cutবা perlএই জন্য। আপনি যদি সত্যিই এটিটিতে প্রবেশ করার জন্য জেদ করেন তবে এটি ব্যবহার করুন awk
আমাদান

4
@ সিজেএক্স: এটি নুল বাইট যোগ করে না, এটি প্রতিটি খালি মাঠের মধ্যে এফএস রেখে দেয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

4
কমনীয়তার জন্য দয়া করে @ Ascherer এর উত্তর দেখুন।

4
@ এরিহুংগ্রিমিকে: কমনীয়তা দুর্দান্ত, তবে আমি সঠিক হতে চাই। : পি
আমদান

68

আপনি যখন ক্ষেত্রের একটি পরিসীমা করতে চান, awkসত্যিই এটি করার সরাসরি কোনও সরল পথ নেই। cutপরিবর্তে আমি সুপারিশ করব :

cut -d' ' -f 9- ./infile

সম্পাদনা করুন

একটি ট্যাব হওয়ার কারণে ডিফল্টরূপে স্পেস ফিল্ড ডিলিমিটার যুক্ত হয়েছে। এটি উল্লেখ করার জন্য গ্লেনকে ধন্যবাদ


15
কাটা সম্পর্কে একটি জিনিস হ'ল এটি একটি নির্দিষ্ট ডিলিমিটার (ডিফল্টরূপে ট্যাব) ব্যবহার করে, যেখানে awk "সাদা স্থান" ব্যবহার করে। কাটা সহ, টানা 2 টি ট্যাব একটি খালি ক্ষেত্র সীমাবদ্ধ করে।
গ্লেন জ্যাকম্যান 22'11

4
@Glennjackman যেমন উল্লেখ করেছে, অজকের ডেলিমিটারটি "হোয়াইটস্পেস" (যে কোনও পরিমাণও)। সুতরাং একক স্পেসে কাটা ডিলিমিটার সেট করাও আচরণের সাথে মেলে না। দুর্ভাগ্যক্রমে লুপটি সবচেয়ে ভাল যেটি করা সম্ভব তাই এটি দেখায়।
পঞ্চা

এই এক সঠিকভাবে কাজ করে না। কমান্ড চেষ্টা করুন find . | xargs ls -l | cut -d' ' -f 9-। কোনও কারণে ডাবল স্পেসগুলিও গণনা করা হয়। উদাহরণ: এর lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_bফলাফল হবে./file_a 00:06 ./file_b
মার্কো প্যাশকভ

@ মারকোপাশকভ এই বিষয়ে সঠিকভাবে কাজ করে না দয়া করে আপনার পাইপলাইনে ঠিক একই কোডটি ব্যবহার করার বিষয়টি বিবেচনা করে বিবেচনা করুন। যাইহোক, আপনার কখনই ls এর আউটপুট পার্স করার চেষ্টা করা
সিজেএক্সএক্স

কাট এখানে কাজ না। উদাহরণস্বরূপ, যদি আপনার ইনপুটটি একটি লাইনের জন্য "ফু বার" (একক স্পেস) হয় এবং অন্য ফোনের জন্য "ফু ___ বার" (যেমন একাধিক স্পেস তবে এসও খুব স্মার্ট) থাকে তবে কাটা তাদের আলাদাভাবে প্রক্রিয়া করবে।
ইউকেমনকি

54
awk '{print substr($0, index($0,$9))}'

সম্পাদনা : দ্রষ্টব্য, নবমীর আগে কোনও ক্ষেত্রের নবম হিসাবে একই মান থাকলে এটি কাজ করে না।


4
এই এক উজ্জ্বল!

10
@ গিরিহুংগ্রিমিকে: ... এবং নবমীর আগে কোনও ক্ষেত্রের মধ্যে নবমীর সমান মান থাকলে তা কাজ করে না।
আমদান

6
সম্ভবত ক্লাসিক বাক্যটির কারণে "আশা করি আপনার ফাইলটিতে সমস্যা নেই"। এটা একটা মোট এর চল নেই : S মধ্যে / W অবস্থায় ইঞ্জিনিয়ারিং "আমরা ত্রুটি-পরীক্ষণের যেমন নেতিবাচক মূল্যবোধের ইনপুট জন্য সহ সময় নষ্ট করতে যাচ্ছেন না, কারণ 'আমরা আশা করি ব্যবহারকারী সেগুলিকে চেষ্টা না বুদ্ধিমান যথেষ্ট হবে, আমাদের সরঞ্জাম ক্র্যাশ করা হচ্ছে ""। হাহাহাহা! সর্বদা এটি শুনতে ভালোবাসি! (আমি এর হাস্যরস একটি ভাল ধারনা মত) আচ্ছা, যেমন ইডিয়টের না বিদ্যমান, এটা বিকাশকারীর দায়িত্ব তার স্টাফ করতে এর নির্বোধ-প্রমাণ ! পরিবর্তে "ভাল মানুষের জন্য আশা"। এটি বরং দার্শনিকদের সাথে প্রত্যাশিত মনোভাব, এস /
ডাব্লু

4
আমি ত্রুটিগুলি যাচাই করার জন্য বলছিলাম না, তবে আপনি যদি জানেন যে আপনি সমস্যাটি নিয়ে যাচ্ছেন না, তবে এই সমাধানটি ঠিক আছে, যেমন আমি বলেছি। তবে অপ্রয়োজনীয় ডাউনটোট @ সাইন্ট্যাক্সারর জন্য আপনাকে ধন্যবাদ। এই সমাধানটি কারও কারও জন্য কার্যকর হবে, যেমনটি (বর্তমানে) 19 টি উপস্থাপনাটি দেখায়, তবে যদি তা না হয় তবে আপনার সমাধানের জন্য এটি ব্যবহার করবেন না। ওপির সমস্যা সমাধানের জন্য প্রচুর উপায় রয়েছে।
Ascherer

4
যদি আপনি আপনার প্রতিদিনের কাজের কমান্ড লাইনে awk ব্যবহার করে থাকেন তবে অবশ্যই এটি আপনার সমাধান চান। এটা কি প্রকট নয়? আপনি যদি এটিকে টাইপ করছেন এবং প্রবেশ করানোর আগে এই ধরণের জিনিসগুলি ধরতে পারেন সেহেতু পরীক্ষা করার ক্ষেত্রে ত্রুটি ইত্যাদির ক্ষেত্রে আসলে কিছু আসে যায় না (ব্যক্তিগতভাবে, আমি মনে করি না যে যাইহোক অন্য কোনও কিছুর জন্য অ্যাড ব্যবহার করা উচিত, তাই আমরা আমাদের 'পারল, পাইথন, টিসিএল এবং প্রায় 100+ অন্যান্য, আরও ভাল, দ্রুত, কম বিরক্তিকর স্ক্রিপ্টিং ভাষাগুলি পেয়েছে!)' অবশ্যই আমি আমার সহকর্মী সফটওয়্যার বিকাশকারীদের অনেক বেশি ক্রেডিট দিচ্ছি এবং তাদের টাইপ করা সামগ্রীতে এমনকি সত্যই ত্রুটির প্রয়োজন নেই
ফ্লাইতে

11
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-

পরিবর্তনশীল প্রস্থের সাদা অংশের সাথে কাজ করার পরিবর্তে সমস্ত সাদা স্থানকে একক স্থান হিসাবে প্রতিস্থাপন করুন। তারপরে cutআগ্রহের ক্ষেত্রগুলির সাথে সহজ ব্যবহার করুন ।

এটি বিশ্রী ব্যবহার করে না তাই জার্মানী হয় না তবে অন্যান্য উত্তর / মন্তব্য দেওয়া যথাযথ বলে মনে হয়।


4
আপনার উত্তরটি আরও ভয়ঙ্কর করুন, অন্যথায় এটি প্রশ্নের মন্তব্য হিসাবে পোস্ট করুন।
আল্পার তুরান

এটি ps faux | ব্যবহারের জন্য আদর্শ । কখনই XYZ স্বীকৃতি পাওয়ার সরঞ্জামটি ভয় পাবেন না the
কেভিনফ

10

সাধারণত পার্ল অ্যাডকে / এসইডি / গ্রেপ ইত্যাদি প্রতিস্থাপন করে। আল।, এবং আরও অনেক বহনযোগ্য (পাশাপাশি কেবল আরও ভাল পেনকেনিফ হওয়া)।

perl -lane 'print "@F[8..$#F]"'

টিমটোড্ডি অবশ্যই প্রয়োগ করে।


আপনাকে কমান্ড লাইন বিকল্প -lযুক্ত \nকরতে হবে বা মুদ্রণ বিবৃতিতে যুক্ত করতে হবে।
গ্লেন জ্যাকম্যান

@ লেগন জ্যাকম্যান: সম্ভবত অন্য কোনও বার্তার অংশ, বা কোনও ভেরিয়েবলের জন্য বরাদ্দ করা দরকার নেই ইত্যাদি " বৃহত্তর স্বতঃস্ফূর্তভাবে খুব অপ্রীতিকর দেখতে পারেন
বোবোগো

আমাকে ভুল করবেন না, আমি পার্ল পছন্দ করি। আমি যাই হোক না কেন এটি জন্য awk ভালবাসেন।
গ্লেন জ্যাকম্যান

আমার এম্বেড থাকা ডিভাইস পার্লের সাথে আসে না, তবে এটি অজানা।
সেপিরো

ডাউনভোটিং কারণ প্রশ্নটি কীভাবে পার্ল, রুবি, জাভা, পাইথন, বাশকে না করে বিশ্রীভাবে এটি করতে হয় তা জিজ্ঞাসা করা হয়েছিল।
টম হ্যারিসন

3
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

প্রদত্ত ক্ষেত্রটি এনআর।, এন এর আগে যা আছে তা এই চপগুলি এবং ক্ষেত্রের এনআরএন এবং সহ সমস্ত লাইনের মুদ্রণ করে এবং মূল ফাঁক রক্ষণাবেক্ষণ করে (এটি পুনরায় ফর্ম্যাট করে না)। যদি ক্ষেত্রের স্ট্রিংটি লাইনের অন্য কোথাও উপস্থিত হয় তবে এটি ম্যাটার করে না, যা Ascherer এর উত্তর নিয়ে সমস্যা।

একটি ফাংশন সংজ্ঞায়িত করুন:

fromField () { 
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

এবং এটি এর মতো ব্যবহার করুন:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost   

আউটপুট সমস্ত স্থান বজায় রাখে, ট্র্যাকিং স্পেস সহ এন = 0 এর জন্য এটি পুরো লাইনটি যেমনটি ফিরে আসে, এবং এন> এনএফের জন্য খালি স্ট্রিংটি দেয়


এটা একটা ভালো বুদ্ধি. এটি সাধারণ মেশিন ব্যবহার করে কোনও বর্তমান ম্যাকের পক্ষে যথেষ্ট কাজ করে না, কারণ $ 0 ধসে পড়ে। ফিক্সটি প্রথম পদক্ষেপ হিসাবে $ 0 এ একটি ভেরিয়েবল সেট করতে হবে, যেমন: '{s = $ 0; ... মুদ্রণ সাবস্ট্রাস্ট (গুলি, সূচক (গুলি, মি) +1}
জোয়েলপার্কেরহেন্ডারসন

1

এখানে ls -lআউটপুট উদাহরণ :

-rwxr-----@ 1 ricky.john  1493847943   5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john  1493847943  27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john  1493847943  21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john  1493847943  10627144 Apr 16 14:09 03-Where to Get Help.mp4

যে কোনও পোস্ট মুদ্রণের জন্য আমার সমাধান $9 isawk '{print substr($0, 61, 50)}'



0

প্রথম 3 টি ক্ষেত্র প্রদর্শন করতে এবং অবশিষ্ট ক্ষেত্রগুলি মুদ্রণ করতে আপনি ব্যবহার করতে পারেন:

awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename

যেখানে 3 1 $ 2 $ 3 প্রথম 3 ক্ষেত্র।


0
function print_fields(field_num1, field_num2){
    input_line = $0

    j = 1;
    for (i=field_num1; i <= field_num2; i++){
        $(j++) = $(i);

    }
    NF = field_num2 - field_num1 + 1;
    print $0

    $0 = input_line
}

0

অজকের পরিবর্তে কাট ব্যবহার করা এবং -c অক্ষর কাট কমান্ডটি ব্যবহার করে কোন কলামটি শুরু করা উচিত তা নির্ধারণের সাথে সমস্যাগুলি কাটিয়ে ওঠা।

এখানে আমি বলছি, আউটপুটটির প্রথম 49 টি অক্ষর ছাড়া আমাকে সমস্ত দিন give

 ls -l /some/path/*/* | cut -c 50-

/*/*/Ls কমান্ড শেষে তা আমাকে দেখাও সাবডিরেক্টরি খুব বলছে করা হয়।

আপনি আলা (কাটা ম্যান পৃষ্ঠা থেকে) অক্ষরগুলির নির্দিষ্ট রেঞ্জগুলিও বের করতে পারেন। উদাহরণস্বরূপ, বর্তমানে লগ ইন করা ব্যবহারকারীদের নাম এবং লগইন সময়গুলি দেখান:

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