শেষ কলামে তৃতীয় কলাম কীভাবে প্রিন্ট করা যায়?


121

আমি ডিবিজিভিউ লগ ফাইল থেকে প্রথম দুটি কলাম (যার মধ্যে আমি আগ্রহী না) সরিয়ে দেওয়ার চেষ্টা করছি। লাইন শেষ হওয়ার পরে আমি 3 টি কলাম থেকে প্রিন্ট করে এমন কোনও উদাহরণ খুঁজে পাচ্ছি না। নোট করুন যে প্রতিটি লাইনে চলক সংখ্যক কলাম রয়েছে।


উত্তর:


108

... বা একটি সহজ সমাধান: cut -f 3- INPUTFILE কেবল সঠিক ডিলিমিটার যুক্ত করুন (-ড) এবং আপনি একই প্রভাব পেয়েছেন।


9
মনে রাখবেন যে ডিলিমিটারটি সমস্ত কলামের মধ্যে হুবহু একইভাবে কাজ করে ... উদাহরণস্বরূপ, আপনি \ d + এর মতো ডিলিমিটার দিয়ে কাট ব্যবহার করতে পারবেন না। (যা আমি জানি))
জ্যাচ উইলি

72
যখন প্রশ্নকে শিরোনাম শিরোনাম করা হয় তখন এটি জঞ্জক বাদে অন্য উত্তর গ্রহণ করা অনুচিত। জনগণের যদি এডকে স্ক্রিপ্টগুলির জন্য এটির প্রয়োজন হয়? এই উত্তরটি স্রেফ একটি মন্তব্য করা উচিত ছিল।
syaz

24
@ স্যাজেড: সাধারণত আমি সম্মত হই, তবে এই বোর্ডে 'গ্র্যাচুয়াস অ্যাজক' এর পরিমাণ নিয়ে আমি ভেবেছিলাম এই কাজটি করার বিকল্প উপায় দেখাতে হবে। যদি কেউ আপনাকে একই কাজটি করার সহজ এবং দ্রুত উপায় দেখায় তবে আপনি কি কৃতজ্ঞ হবেন না? অন্যান্য পোস্টের উত্তরগুলি 'ভুল নয়, তবে' অবশ্যই অসম্ভব 'বলে সংখ্যার কারণেই পোস্টারটি ভেবেছিল পোস্টটি হ'ল একমাত্র উপায়?
মার্সিন

12
মন্তব্যটি এটাই। সেরা উত্তম উত্তরটি গ্রহণ করুন এবং মন্তব্যে আরও নন-অ্যাজক পরামর্শ দিন। লোকেরা যদি এমন উত্তর পোস্ট করতে শুরু করে যা প্রশ্নের উত্তর দেয় না, তবে অনুসন্ধান করার সময় এটি বিরক্তিকর হবে (আমার ক্ষেত্রে)।
syaz

12
সমস্ত কলামের মধ্যেই কেবল সীমানার একই হতে হবে না, তবে কলামগুলির মধ্যে অবশ্যই এক ডিলিমিটার অক্ষর থাকতে হবে। সুতরাং আপনি যদি এমন প্রোগ্রামগুলির সাথে ডিল করছেন যেগুলি তাদের আউটপুটটি ডিলিমিটারগুলির সাথে সারিবদ্ধ করে, অ্যাডক ব্যবহার করা ভাল।
sknaumov

111
awk '{for(i=3;i<=NF;++i)print $i}' 

3
awk '{for (i = 3; i <= NF; ++ i) মুদ্রণ $ i।' আরও কমপ্যাক্ট হতে পারে। :)
ব্যবহারকারী 172818

1
ধন্যবাদ, lh3। আমি কেবল গোক ম্যানুয়ালটির জন্য অনুলিপি এবং আটকানো ছিল। :)
জোনাথন ফেইনবার্গ

22
এটি একাধিক লাইনের সাথে ব্যর্থ হয়, প্রতিটি কলাম একটি নতুন লাইন হিসাবে আঁকা যখন প্রিন্ট করা হয়
meso_2600

12
ফাটানো আউটপুট সমস্যার সমাধান করার জন্য, আমি এই সমাধান প্রস্তাব: awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'( printfযখন সম্পর্কে newline গৃহস্থালির কাজ প্রিন্ট করা হবে না print ""অন্যান্য ক্ষেত্রের পর সম্পর্কে newline যোগ হবে মুদ্রিত হয়েছে)
lauhub

1
বা: echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}', দেয় যা: 3 4 5 6 7 8 9 10
এক্স-ইউরি 13

106
awk '{ print substr($0, index($0,$3)) }'

সমাধানটি এখানে পাওয়া গেছে:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count179078/


23
আমি এর জন্য দেরী করছি, তবে এটি রেকর্ডগুলির জন্য কাজ করবে না যেখানে প্রথম বা দ্বিতীয় ক্ষেত্রটি তৃতীয় (যেমন, 3 2 3 4 5) এর
সমান

অভ্যন্তরীণ পরিসীমা মুদ্রণ করাও সম্ভব: `` `# থেকে $ 3 (অন্তর্ভুক্ত) থেকে $ 6 (বাদ); প্রতিধ্বনি "1,2,3,4,5,6,7,8,9" | awk 'BEGIN {FS = ","; OFS = ","} {মুদ্রণ সাবস্ট্রাস্ট ($ 0, সূচক ($ 0, $ 3), দৈর্ঘ্য ($ 0) -ইন্ডেক্স ($ 0, $ 6) -1)}'; # 3,4,5``` দেয়
স্প্লাইসান

34

জোনাথন ফেনবার্গের উত্তর প্রতিটি ক্ষেত্রকে আলাদা লাইনে মুদ্রণ করে। আপনি printfএকই লাইনে আউটপুট রেকর্ডটি পুনর্নির্মাণ করতে ব্যবহার করতে পারেন , তবে আপনি কেবল ক্ষেত্রগুলি বাম দিকে সরাতে পারেন।

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile

1
সচেতন থাকুন, এটি কেবল Gnu awk এর জন্যই কাজ করে, পসিক্স NFদ্বারা হ্রাসের অনুমতি নেই।
Kvantour 4'19

1
@ কান্তা’র: এটি গাওক, মওক, ম্যাকস অ্যাজকে (নাক?) কাজ করে। পজিক্স NFহ্রাস করা যায় কিনা সে বিষয়ে নীরব রয়েছে বলে মনে হয় ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।


19
awk '{$1=$2=$3=""}1' file

এনবি: এই পদ্ধতিটি 1,2,3 ক্ষেত্রে "ফাঁকা" ছেড়ে দেবে তবে আপনি আউটপুটটি দেখতে চাইলে কোনও সমস্যা হবে না।


Command | দিয়ে সেই আদেশটি অনুসরণ করুন সেড এস / ^ \ * // | কলাম -t` নেতৃস্থানীয় স্পেস ফালা এবং অবশিষ্ট কলামগুলি সারিবদ্ধ করতে
এমএসপ্রেজ

শেষ 1মানে কি? আমি কোন কীওয়ার্ড দিয়ে সন্ধান করব awk?
Itachi


1
@ নাথান আপনি এই সমস্যাটি সমাধান করেছেন{$1=$2=$3="";$0=$0;$1=$1}1
17

11

আপনি যদি একই লাইনে উদাহরণস্বরূপ তৃতীয়টির পরে কলামগুলি মুদ্রণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

উদাহরণ স্বরূপ:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

এটি মুদ্রণ করবে:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

আমরা দেখতে পাচ্ছি, পেসলিপ এমনকি জায়গার সাথেও, সঠিক লাইনে দেখায়।


দ্রুত এবং মসৃণ। ধন্যবাদ;)
9nz9

আমার পক্ষে $ NF বর্জন করা নিয়ে সমস্যা না থাকলে এটি দুর্দান্ত। যখন আমি শর্তটি সেট করি (<= NF) আমি শেষ ক্ষেত্রটি পাই তবে প্রথম ক্ষেত্রের প্রথম অক্ষরটি কেটে ফেলা হয়। কার্যকারিতার দিক দিয়ে আমি কি কিছু ভুল বুঝছি?
কেন ইঙ্গ্রাম

দেখে মনে হচ্ছে আমার সমস্যাটি হ'ল column এম শেষ কলামের শেষে আটকে আছে। কীভাবে এটি অপসারণ করবেন তা দেখুন না।
কেন ইঙ্গ্রাম

8

নিম্নলিখিত লাইন সম্পর্কে কি:

awk '{$ 1 = $ 2 = $ 3 = ""; মুদ্রণ ফাইল

@ ঘোস্টডোগ sugges৪ পরামর্শের ভিত্তিতে। আপনি লাইনগুলি ফিল্টার করার সময় আমার আরও ভাল আচরণ করা উচিত, যেমন:

awk '/ ^ exim4-config / {$ 1 = ""; মুদ্রণ ফাইল

সংক্ষিপ্ত এবং সাধারণ sed 's/\s\+//g'নেতৃস্থানীয় স্থানগুলি ছাঁটাই করতে কমান্ডের শেষে পাইপ ও যুক্ত করতেও পারে
jumping_monkey

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

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

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

fromField () { 
awk -v m="\x0a" -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 

আউটপুট পিছনে স্থান সহ সমস্ত কিছু বজায় রাখে

ফাইলগুলির জন্য ভাল কাজ করে যেখানে '/ n' রেকর্ড বিভাজক হয় যাতে আপনার লাইনের ভিতরে নতুন লাইনের চর নেই। আপনি যদি এটি অন্যান্য রেকর্ড বিভাজকের সাথে ব্যবহার করতে চান তবে ব্যবহার করুন:

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

উদাহরণ স্বরূপ. যতক্ষণ না তারা হেক্সাডেসিমাল চর এনআর ব্যবহার না করে প্রায় সব ফাইলের সাথে ভাল কাজ করে। 1 লাইনের ভিতরে।


4

নিম্নলিখিত লভ্য কমান্ডটি প্রতিটি লাইনের শেষ এন ক্ষেত্রগুলি প্রিন্ট করে এবং লাইনের শেষে একটি নতুন লাইন অক্ষর প্রিন্ট করে:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

নীচে একটি উদাহরণ সন্ধান করুন যা / ইউএসআর / বিন ডিরেক্টরিটির বিষয়বস্তু তালিকাভুক্ত করে এবং তারপরে সর্বশেষ 3 লাইন ধরে এবং তারপরে প্রতিটি লাইনের শেষ 4 টি কলাম ছদ্মবেশ ব্যবহার করে মুদ্রণ করে:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

4
awk '{a=match($0, $3); print substr($0,a)}'

প্রথমে আপনি তৃতীয় কলামটি শুরু করার অবস্থানটি সন্ধান করুন। সাবস্ট্রাস্টের সাহায্যে আপনি লাইনটির শেষে (এই ক্ষেত্রে ক) অবস্থান থেকে শুরু করে পুরো লাইনটি ($ 0) মুদ্রণ করবেন।


3

ঠিক আছে, আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করে সহজেই একই প্রভাব অর্জন করতে পারেন। বিভাজকটি একটি স্থান হিসাবে ধরে নেওয়া, এটি দেখতে এই রকম হবে:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

1
আমি রেজেক্স এড়াতে চাই দুর্ঘটনাক্রমে জগাখিচুড়ি করা সম্ভবত এটি ধীর এবং সহজ।
ক্যাস্যাবেল

1
এটি এটি এর মতো সংক্ষিপ্ত করে: awk '{ sub(/([^ ]+ +){2}/, ""); print }'যা প্যাটার্নটি দু'বার দূরে নেয়।
এরিক


2

পার্ল সমাধান:

perl -lane 'splice @F,0,2; print join " ",@F' file

এই কমান্ড-লাইন বিকল্পগুলি ব্যবহার করা হয়:

  • -n ইনপুট ফাইলের প্রতিটি লাইন প্রায় লুপ, প্রতিটি লাইন স্বয়ংক্রিয়ভাবে মুদ্রণ করবেন না

  • -l প্রসেসিংয়ের আগে নতুন লাইনগুলি সরিয়ে দেয় এবং পরে এগুলিকে আবার যুক্ত করে

  • -aঅটোস্প্লিট মোড - @F অ্যারেতে বিভক্ত ইনপুট লাইনগুলি। সাদা স্থানটিতে বিভাজনে ডিফল্ট

  • -e পার্ল কোডটি কার্যকর করুন

splice @F,0,2 @F অ্যারে থেকে 0 এবং 1 কলাম পরিষ্কারভাবে সরিয়ে দেয়

join " ",@F প্রতিটি উপাদানগুলির মধ্যে একটি স্পেস ব্যবহার করে @F অ্যারের উপাদানগুলিতে যোগদান করে

যদি আপনার ইনপুট ফাইলটি স্থান-সীমান্তের পরিবর্তে কমা-বিস্মৃত হয়, তবে ব্যবহার করুন -F, -lane


পাইথন দ্রবণ:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file


1

এখানে কিছুটা দেরি হলেও উপরের কোনওটিই কাজ করছে বলে মনে হয়নি। এটি চেষ্টা করুন, প্রিন্টফ ব্যবহার করে প্রত্যেকের মধ্যে ফাঁকা স্থান সন্নিবেশ করান। আমি শেষ পর্যন্ত নতুন লাইন না থাকা বেছে নিয়েছি।

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'

1
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

মূল ফাইলটিতে তারা ছিল একই ক্রমে চতুর্থ ক্ষেত্র থেকে শেষ ক্ষেত্রের রেকর্ড মুদ্রণ করে


দুঃখিত, এটি বেশ সঠিক উত্তর ছিল না। এটি খুব নির্দিষ্ট, তবে কীভাবে এটি মুছতে হয় তা আমি জানি না
ম্যাসিমো

1

বাশ-এ আপনি অবস্থানগত পরামিতিগুলির সাথে নিম্নোক্ত বাক্য গঠন ব্যবহার করতে পারেন:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

আরও জানুন: বাশ হ্যাকার্স উইকিতে অবস্থানিক পরামিতিগুলি পরিচালনা করা


0

যদি এটি কেবলমাত্র প্রথম দুটি ক্ষেত্রকে অগ্রাহ্য করার বিষয়ে এবং যদি আপনি এই ক্ষেত্রগুলি মুখোশ দেওয়ার সময় কোনও স্থান চান না (উপরের উত্তরগুলির মতো কিছু করুন):

awk '{gsub($1" "$2" ",""); print;}' file

0
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

প্রথম দুটি কলাম সাফ হয়ে গেছে, sedশীর্ষস্থানীয় স্থানগুলি সরিয়ে দেয়।


-2

এডাব্লুকে কলামগুলিকে ক্ষেত্র বলা হয়, সুতরাং এনএফই কী

সমস্ত সারি:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

প্রথম সারিটি:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.