প্রথম তিনটি কলাম বাদে সমস্ত মুদ্রণ করুন


112

খুব জটিল:

awk '{print " "$4" "$5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13}' things

43
আপনি কেবল ব্যবহার করতে পারবেন না এমন কোনও কারণ আছে cut -f3-?
ক্যাসকেবেল

1
@hhh সুন্দর একটি .. আমি একটি সংক্ষিপ্ত উত্তরের ধারণা পছন্দ করি।
ক্রিস সিমুর

2
@Jefromi - কারণ সেখানে কাটা, যা awk নেই সঙ্গে সঙ্গতিপূর্ণ বাফারিং সমস্যা হল: stackoverflow.com/questions/14360640/...
sdaau


@ জেফ্রোমি - cutক্রিয়াকলাপের পূর্বেও রেজিেক্সস থাকে না {}এবং তারপরে ক্ষেত্রের ডেলিমিটারগুলি (স্পেসের পরিবর্তনশীল সংখ্যা?) এর সাথে এটি গভীর হয়ে যায় এবং আপনাকে সেগুলি ম্যানুয়ালি নির্দিষ্ট করতে হবে। আমি মনে করি ওপি কিছু shift Nকমান্ড সম্পর্কে শুনতে চেয়েছিল , যার অস্তিত্ব নেই। নিকটতমটি $1="";$2="";(...);print}, তবে আমার ক্ষেত্রে এটি কিছু নেতৃস্থানীয় স্থান (সম্ভবত বিভাজক) ছেড়ে দেয়।
টমাসজ গ্যান্ডার

উত্তর:


50

এমন একটি সমাধান যা অতিরিক্ত নেতৃস্থানীয় বা পিছনে সাদা সাদা স্থান যুক্ত করে না :

awk '{ for(i=4; i<NF; i++) printf "%s",$i OFS; if(NF) printf "%s",$NF; printf ORS}'

### Example ###
$ echo '1 2 3 4 5 6 7' |
  awk '{for(i=4;i<NF;i++)printf"%s",$i OFS;if(NF)printf"%s",$NF;printf ORS}' |
  tr ' ' '-'
4-5-6-7

সুডো_ও টার্নারি অপারেটরটি ব্যবহার করে মার্জিত উন্নতির প্রস্তাব দেয়NF?ORS:OFS

$ echo '1 2 3 4 5 6 7' |
  awk '{ for(i=4; i<=NF; i++) printf "%s",$i (i==NF?ORS:OFS) }' |
  tr ' ' '-'
4-5-6-7

এডমার্টন ক্ষেত্রগুলির মধ্যে মূল শ্বেতস্পেস সংরক্ষণের জন্য একটি সমাধান দেয়:

$ echo '1   2 3 4   5    6 7' |
  awk '{ sub(/([^ ]+ +){3}/,"") }1' |
  tr ' ' '-'
4---5----6-7

বাইনারিজেব্রা দুটি দুর্দান্ত সমাধান প্রদান করে:
(এই সমাধানগুলি মূল স্ট্রিং থেকে পিছনের স্থানগুলি সংরক্ষণ করে)

$ echo -e ' 1   2\t \t3     4   5   6 7 \t 8\t ' |
  awk -v n=3 '{ for ( i=1; i<=n; i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 ' |
  sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
"4...5...6.7.->.8->."

$ echo -e ' 1   2\t \t3     4   5   6 7 \t 8\t ' |
  awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }' |
  sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'
"4...5...6.7.->.8->."

মন্তব্যগুলিতে লার্স দ্বারা প্রদত্ত সমাধানটি প্রায় সঠিক:

$ echo '1 2 3 4 5 6 7' | 
  awk '{for (i=3;i<=NF;i++) $(i-2)=$i; NF=NF-2; print $0}' | tr  ' ' '-'
3-4-5-6-7

এটি লার্স দ্রবণটির স্থির ও প্যারামিট্রাইজড সংস্করণ :

$ echo '1 2 3 4 5 6 7' | 
  awk '{for(i=n;i<=NF;i++)$(i-(n-1))=$i;NF=NF-(n-1);print $0}' n=4 | tr ' ' '-'
4-5-6-7

সেপ্টেম্বর -2013 এর আগে অন্য সমস্ত উত্তরগুলি দুর্দান্ত তবে অতিরিক্ত স্থান যুক্ত করুন:


এডমার্টনের উত্তর আমার পক্ষে কার্যকর হয়নি (ব্যাশ ৪.১.২ (১) -আগ্রহ করে, জিএনইউ অ্যাউক ৩.১. or বা ব্যাশ ৩.২.২৫ (১) রিরিজ, জিএনইউ অ্যাওক ৩.১.৫) তবে এখানে অন্যভাবে পাওয়া গেছে :echo ' This is a test' | awk '{print substr($0, index($0,$3))}'
এলিশ্চ

1
@ ইলিশ না, এটি সাধারণভাবে কাজ করবে না, এটি কিছু নির্দিষ্ট ইনপুট মানগুলি দিয়ে কাজ করে বলে মনে হচ্ছে। আমার মন্তব্যে আপনার মন্তব্যের নীচে আমি যে মন্তব্য যুক্ত করেছি তা দেখুন।
এড মর্টন 21

1
হাই @ ফেডোরকুই আমার উত্তর প্রথম এক। আমার আসল উত্তরে আমি ব্যাখ্যা করছিলাম কেন অন্য উত্তর সঠিক ছিল না (অতিরিক্ত নেতৃস্থানীয় বা হোয়াইট স্পেস) কিছু লোক মন্তব্যগুলির মধ্যে বর্ধনের প্রস্তাব দিয়েছেন। আমরা ওপিকে আরও সঠিক উত্তর চয়ন করতে বলেছি, এবং সে আমার নির্বাচন করেছে। কিছু অন্যান্য অবদানকারী আমার উত্তর সম্পাদনার পরে উত্তরটির উত্তর দেখুন (ইতিহাস দেখুন)। এটা কি আপনার জন্য পরিষ্কার? আমার উত্তরের বোধগম্যতার উন্নতি করার জন্য আপনি আমাকে কী পরামর্শ দিচ্ছেন? চিয়ার্স ;-)
অলিবার

1
আপনি একেবারে ঠিক বলেছেন এবং আমার ভুল বোঝাবুঝির জন্য আমি খুব দুঃখিত। আমি উত্তরের জন্য দ্রুত পাঠ করেছি এবং আপনার মূল উত্তরটি লক্ষ্য করিনি (হ্যাঁ, আমি খুব দ্রুত পড়ি)। উত্তরের জন্য এনএফ -1 পর্যন্ত লুপটি করার জন্য উত্তম কৌতুকটি ব্যবহার করে নিজেই +1 এবং তারপরে অতিরিক্ত শ্বেতস্থান এড়াতে শেষ উপাদানটি মুদ্রণ করুন। আর আবার দুঃখিত! (ভবিষ্যতের পাঠকদের ভুল বোঝাবুঝি রোধের জন্য আমার মন্তব্যটি একদিনের মধ্যে সরিয়ে ফেলবে)।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

1
আমি কিছু ধরণের শিরোনাম ব্যবহার করব: <আপনার উত্তর> এবং তারপরে একটি অনুভূমিক বিধি অনুসরণ করে একটি বড় শিরোনাম "অন্যান্য উত্তরের তুলনা"। অন্যথায়, এই
তুলনাটিকে

75
awk '{for(i=1;i<4;i++) $i="";print}' file

4
OFSআপনি লেনদেন না করায় এটি অগ্রণী হিসাবে চলে যাবে NFঅর্থাৎ রেকর্ডগুলির মধ্যে শীর্ষস্থানীয় স্থান।
ক্রিস সিমুর 21

70

ব্যবহার কাটা

$ cut -f4-13 file

অথবা আপনি জোর দিয়ে জিদ করলে এবং $ 13 হল শেষ ক্ষেত্র

$ awk '{$1=$2=$3="";print}' file

আর

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

14
শেষ উদাহরণে "13" এর চেয়ে সম্ভবত "এনএফ" ব্যবহার করা ভাল।
গ্লেন জ্যাকম্যান

2
2 পরিস্থিতি যা সিদ্ধান্ত নেওয়ার জন্য ওপি পর্যন্ত to 13 টি যদি শেষ ক্ষেত্র হয় তবে এনএফ ব্যবহার করা ঠিক আছে। যদি তা না হয় তবে 13 ব্যবহার করা উপযুক্ত।
ghostdog74

3
2 য় 0 of 0 শুরু থেকে 3 কপি অফস মুছতে হবে। তৃতীয়টি আরও ভাল হবে printf "%s ",$i, যেহেতু আপনি জানেন না যে এটি $iথাকতে পারে %sবা থাকতে পারে । তবে এটি শেষে একটি অতিরিক্ত স্থান মুদ্রণ করবে।
dubiousjim

38

এটা চেষ্টা কর:

awk '{ $1=""; $2=""; $3=""; print $0 }'

1
এটি কতটা গতিশীল তার কারণে এটি দুর্দান্ত। আপনি শেষে কলাম যুক্ত করতে পারেন এবং আপনার স্ক্রিপ্টগুলি পুনরায় লিখতে পারেন না।
MinceMan

1
প্রশ্নটি ঠিক আপনার বিপরীতে আপনার সাথে ডিল করার চেষ্টা করছে এমন সমস্যাটি এটি প্রমাণ করে। 100 তম ক্ষেত্র থেকে মুদ্রণ সম্পর্কে কি? NFআপনি অগ্রণী হিসাবে যাতে মোকাবিলা করবেন না উল্লেখ করার জন্য নোট OFS
ক্রিস সিমুর 21

24

এটি করার সঠিক উপায়টি একটি আরআর বিরতি সহকারে এটি আপনাকে কেবলমাত্র কতগুলি ক্ষেত্র এড়িয়ে চলে যায় তা জানাতে দেয় এবং বাকি ক্ষেত্রগুলির জন্য আন্তঃক্ষেত্রের ব্যবধান বজায় রাখে।

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

$ echo '1   2 3 4   5    6' |
awk '{sub(/([^ ]+ +){3}/,"")}1'
4   5    6

আপনি যদি শীর্ষস্থানীয় স্থান এবং ফাঁকা ফাঁকা স্থানগুলিকে সমন্বিত করতে চান তবে আবার ডিফল্ট এফএস দিয়ে থাকেন তবে তা হ'ল:

$ echo '  1   2 3 4   5    6' |
awk '{sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}/,"")}1'
4   5    6

আপনার যদি এমন একটি এফএস থাকে যা আপনি একটি অক্ষর সেটকে অস্বীকার করতে পারবেন না তবে আপনি প্রথমে একটি একক চরে রূপান্তর করতে পারেন (আরএস আদর্শ নয় যদি এটি কোনও একক চর থেকে কোনও ক্ষেত্রের মধ্যে আরএস উপস্থিত না হয়, অন্যথায় সাবস্কেপ বিবেচনা করুন), তারপরে আরআর অন্তর সাবস্ক্রিপশন প্রয়োগ করুন, তারপরে ওএফএসে রূপান্তর করুন। উদাহরণস্বরূপ যদি "।" এর চেইনগুলি ক্ষেত্রগুলি পৃথক করে:

$ echo '1...2.3.4...5....6' |
awk -F'[.]+' '{gsub(FS,RS);sub("([^"RS"]+["RS"]+){3}","");gsub(RS,OFS)}1'
4 5 6

স্পষ্টতই যদি অফস একক চর হয় এবং এটি ইনপুট ক্ষেত্রগুলিতে উপস্থিত না হতে পারে তবে আপনি এটিকে হ্রাস করতে পারেন:

$ echo '1...2.3.4...5....6' |
awk -F'[.]+' '{gsub(FS,OFS); sub("([^"OFS"]+["OFS"]+){3}","")}1'
4 5 6

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


আমার পক্ষে কাজ করেনি (বাশ 4.1.2 (1) -প্রকাশ, জিএনইউ অ্যাওক 3.1.7 বা ব্যাশ 3.2.25 (1) -রেলিজ, জিএনইউ অ্যাওক 3.1.5) তবে এখানে অন্যভাবে পাওয়া গেছে :echo ' This is a test' | awk '{print substr($0, index($0,$3))}'
এলিশ

2
না, এটি ব্যর্থ হবে যদি $ 1 বা $ 2 এ স্ট্রিং থাকে যা $ 3 সেট করা থাকে। উদাহরণস্বরূপ চেষ্টা করুন, echo ' That is a test' | awk '{print substr($0, index($0,$3))}'এবং আপনি সেই পাবেন aযে $ 3 ম্যাচ aভিতরে That$ 1 হবে। গাকের মতো খুব পুরানো সংস্করণে আপনার পতাকাটির সাথে আরআর অন্তরকে সক্ষম করতে হবে --re-interval
এড মর্টন

2
আপনি ঠিক বলেছেন, খেয়াল করেনি। যাইহোক, সত্যিই আপনার মন্তব্য প্রশংসা। অনেক সময় উপাদানগুলির সংখ্যা নির্দিষ্ট করতে "{}" দিয়ে একটি রেজেক্স ব্যবহার করতে চেয়েছিল এবং লোকটিতে "--re-interval" কখনও দেখেনি। আপনার জন্য +1
elysch

1
1একটি সত্য শর্ত এবং তাই বর্তমান রেকর্ডটি মুদ্রণের ডিফল্ট বিশ্রী ক্রিয়াকে আহ্বান জানায়।
এড মর্টন

1
idk এটি কমনীয় তবে আমি এখন একটি উত্তর যুক্ত করেছি।
এড মর্টন

10

খুব সুন্দর সমস্ত উত্তর বর্তমানে নেতৃস্থানীয় স্পেস, পিছনের স্থান বা অন্য কোনও বিভাজক সমস্যা যুক্ত করে। চতুর্থ ক্ষেত্র থেকে যেখানে বিভাজক সাদা স্থান এবং আউটপুট বিভাজক একটি একক স্থান ব্যবহার করে awkতা নির্বাচন করতে হবে:

awk '{for(i=4;i<=NF;i++)printf "%s",$i (i==NF?ORS:OFS)}' file

প্রারম্ভিক ক্ষেত্রটি প্যারামিট্রাইজ করতে আপনি করতে পারেন:

awk '{for(i=n;i<=NF;i++)printf "%s",$i (i==NF?ORS:OFS)}' n=4 file

এবং শেষ ক্ষেত্র:

awk '{for(i=n;i<=m=(m>NF?NF:m);i++)printf "%s",$i (i==m?ORS:OFS)}' n=4 m=10 file

6
awk '{$1=$2=$3="";$0=$0;$1=$1}1'

ইনপুট

1 2 3 4 5 6 7

আউটপুট

4 5 6 7

4
echo 1 2 3 4 5| awk '{ for (i=3; i<=NF; i++) print $i }'

3
বা এগুলি একই লাইনে পেতে, $ 3 থেকে $ 1 ইত্যাদি নির্ধারণ করুন এবং তারপরে NF কে ক্ষেত্রের সঠিক সংখ্যায় পরিবর্তন করুন। echo 1 2 3 4 5| awk '{ for (i=3; i<=NF; i++) $(i-2)=$i; NF=NF-2; print $0 }'
লার্স

হাই @ আলসার আপনার প্রস্তাবিত কমান্ড লাইনটি একক সঠিক উত্তর। অন্যান্য সমস্ত উত্তর অতিরিক্ত স্থান যুক্ত করে (নেতৃস্থানীয় বা পিছনে)। দয়া করে একটি নতুন উত্তরের মধ্যে আপনার কমান্ড লাইন পোস্ট করুন, আমি এটি আপ-ভোট দেব ;-)
অলিব্রে

1
হাই @ সুডো_ও, আমি @ সেলারের সাথে কথা বলছিলাম, তিনি তাঁর মন্তব্যে যে কমান্ড লাইনটি প্রস্তাব করেছিলেন সে সম্পর্কে। কুইপ্রোকো (ভুল বোঝাবুঝি) বের করার আগে আমি প্রায় পাঁচ মিনিট সময় কাটিয়েছি। আমি সম্মত, @ ভেটসিন উত্তর ORSক্ষেত্রগুলির মধ্যে নতুন লাইন ( ) সন্নিবেশ করিয়েছে । আপনার উদ্যোগের জন্য ব্র্যাভো (আমি আপনার উত্তরটি পছন্দ করি)। চিয়ার্স
অলিবার

3

মুদ্রণ বিবৃতি ব্যবহার না করার জন্য আরেকটি উপায়:

 $ awk '{$1=$2=$3=""}sub("^"FS"*","")' file

যখন শর্তটি সত্য মুদ্রণ হয় তখন ডিফল্ট ক্রিয়া হয় aw


এটিতে @lhf উত্তরের যাবতীয় সমস্যা রয়েছে .. এটি কেবল ছোট।
ক্রিস সিমুর

খুব ভাল ধারণা;) আমার উত্তর চেয়ে ভাল! (আমি ইতিমধ্যে আপনার উত্তর গত বছর
upvated আছে

এটি হওয়া উচিত: awk '{$1=$2=$3=""}sub("^"OFS"+","")' fileS 1, $ 2 এবং $ 3 বিষয়বস্তু পরিবর্তনের পরে যা বাকী রয়েছে তা অফস হিসাবে রয়েছে।

3

আমি বিশ্বাস করতে পারি না যে কেউ সরল শেল সরবরাহ করেনি:

while read -r a b c d; do echo "$d"; done < file

অনুরূপ সমাধানের জন্য +1 ... তবে এতে fileবড় (> 10-30KiB) হলে পারফরম্যান্সের সমস্যা থাকতে পারে । বড় ফাইলগুলির জন্য awkসমাধান আরও ভাল সম্পাদন করে।
সত্য

3

বিকল্প 1 থেকে 3 বিকল্পে একাধিক শ্বেতস্পেসে সমস্যা রয়েছে (তবে সহজ)। 4 এবং 5 বিকল্পগুলি বিকাশের কারণ এটি, যা কোনও সমস্যা ছাড়াই একাধিক সাদা স্পেস প্রক্রিয়া করে। অবশ্যই, 4 বা 5 বিকল্পগুলি n=0উভয়ের সাথে ব্যবহার করা হলে যে কোনও শীর্ষস্থানীয় হোয়াইটস্পেস সংরক্ষণ করা হবে কারণ n=0কোনও বিভাজন নেই।

বিকল্প 1

একটি সাধারণ কাটা সমাধান (একক বিস্ময়করদের সাথে কাজ করে):

$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8

বিকল্প 2

কোনও অ্যাজক পুনঃ-ক্যালক জোর করে মাঝে মাঝে যোগ করা নেতৃস্থানীয় স্পেসগুলির সমস্যা (অ্যাডকের কয়েকটি সংস্করণের সাথে কাজ করে) সমাধান করে:

$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8

বিকল্প 3

প্রতিটি ক্ষেত্রটি তৈরি করে মুদ্রণ করা printfআরও নিয়ন্ত্রণ দেয়:

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8

যাইহোক, পূর্ববর্তী সমস্ত উত্তরগুলি ক্ষেত্রের মধ্যে সমস্ত এফএসকে ওএফএসে পরিবর্তন করে। আসুন এটির কয়েকটি সমাধান তৈরি করুন।

বিকল্প 4

ক্ষেত্র এবং ডিলিমিটারগুলি অপসারণের জন্য সাব সহ একটি লুপটি আরও বহনযোগ্য, এবং এফএস থেকে ওএফএসে পরিবর্তনটি ট্রিগার করে না:

$ echo '    1    2  3     4   5   6 7     8  ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4   5   6 7     8

দ্রষ্টব্য: "^ [" এফএস "] *" হ'ল নেতৃস্থানীয় স্পেস সহ একটি ইনপুট গ্রহণ করা।

বিকল্প 5

এমন কোনও সমাধান তৈরি করা সম্ভব যা অতিরিক্ত লিডিং বা ট্রেলিং হোয়াইটস্পেস যোগ না করে এবং gensubজিএনইউ অ্যাডক থেকে ফাংশনটি ব্যবহার করে বিদ্যমান হোয়াইটস্পেসটি সংরক্ষণ করে :

$ echo '    1    2  3     4   5   6 7     8  ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4   5   6 7     8 

এটি একটি গণনা অনুসারে ক্ষেত্রের তালিকা অদলবদল করতেও ব্যবহৃত হতে পারে n:

$ echo '    1    2  3     4   5   6 7     8  ' |
  awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
                b=gensub("^(.*)("a")","\\1",1);
                print "|"a"|","!"b"!";
               }'
|4   5   6 7     8  | !    1    2  3     !

অবশ্যই, এই ক্ষেত্রে, অফসটি লাইনের উভয় অংশ পৃথক করতে ব্যবহৃত হয়, এবং ক্ষেত্রগুলির পিছনে সাদা স্থান এখনও মুদ্রিত হয়।

নোট 1: ["FS"]* ইনপুট লাইনে নেতৃস্থানীয় স্থানগুলিতে অনুমতি দেওয়ার জন্য ব্যবহৃত হয়।


হাই বিজেড আপনার উত্তরটি দুর্দান্ত। তবে বিকল্প 3 কোনও স্পেস (উদাহরণস্বরূপ " 1 2 3 4 5 6 7 8 ") দিয়ে স্ট্রিংয়ের শুরুতে কাজ করে না । অপশন 4 দুর্দান্ত তবে একটি স্পেস দিয়ে স্ট্রিং ব্যবহার করে একটি শীর্ষস্থান রেখে দিন। আপনি কি মনে করেন এটি যদি স্থির হয়? echo " 1 2 3 4 5 6 7 8 " | your awk script | sed 's/ /./g;s/\t/->/g;s/^/"/;s/$/"/'শীর্ষস্থানীয় / মাঝারি / পিছনের স্থানগুলি যাচাই করতে আপনি কমান্ডটি ব্যবহার করতে পারেন ... চিয়ার্স;)
অলিবার

হাই @ ইলিব্রে সাদা স্থানের সাথে 3 বিকল্পটি 4 এবং 5 বিকল্প বিকাশের কারণ হ'ল বিকল্প 4 কেবলমাত্র একটি অগ্রণী স্থান ছেড়ে দেয় যদি ইনপুটটিতে থাকে এবং n 0 (n = 0) সেট করা থাকে। আমি বিশ্বাস করি যে ক্ষেত্রগুলির নির্বাচন (আইএমও ঠিক করার জন্য কিছুই নেই) যখন সঠিক উত্তর is চিয়ার্স।

ঠিক আছে. অতিরিক্ত তথ্যের জন্য ধন্যবাদ :-) দয়া করে এই অতিরিক্ত তথ্য সরবরাহ করে আপনার উত্তরটির উন্নতি করুন :-) চিয়ার্স
অলিব্রে

নিখুঁত :-) আপনার ব্যবহারকারীকে
কতটা অনুশোচনা

1

কাটে একটি - কমপ্লিমেন্ট পতাকা রয়েছে যা কলামগুলি মুছতে সহজ (এবং দ্রুত) করে তোলে। ফলস্বরূপ বাক্য গঠনটি আপনি যা করতে চান তার সাথে সাদৃশ্যপূর্ণ - সমাধানটি পড়া / বুঝতে সহজ করে তোলে। কমম্পিমেন্টটি সেই ক্ষেত্রেও কাজ করে যেখানে আপনি অ-সংগীন কলামগুলি মুছতে চান।

$ foo='1 2 3 %s 5 6 7'
$ echo "$foo" | cut --complement -d' ' -f1-3
%s 5 6 7
$

আপনি আপনার উত্তর আরও ব্যাখ্যা করতে পারেন দয়া করে?
জুলু

উপরের সম্পাদনাটি কি বুঝতে সাহায্য করে? পয়েন্টটি হ'ল কাটার পরিপূরক পতাকা ব্যবহার করা। সমাধানটি AWK বা পার্ল ভিত্তিক সমাধানগুলির চেয়ে দ্রুত এবং আরও সংক্ষিপ্ত বাস্তবায়ন হওয়া উচিত। এছাড়াও, নির্বিচারে কলামগুলি কাটা যেতে পারে।
মাইকেল 21

1

পার্ল সমাধান যা শ্বেত স্পেসে অগ্রণী বা পিছনে যুক্ত করে না:

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

পার্ল @Fঅটোস্প্লিট অ্যারে সূচি থেকে শুরু হয় 0যখন অ্যাজকি ক্ষেত্রগুলি শুরু হয়$1


কমা-বিস্মৃত তথ্যের জন্য পার্ল সমাধান:

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

পাইথন দ্রবণ:

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


0

আমার জন্য অনুরোধটির সবচেয়ে কমপ্যাক্ট এবং আনুগত্যজনক সমাধান

$ a='1   2\t \t3     4   5   6 7 \t 8\t '; 
$ echo -e "$a" | awk -v n=3 '{while (i<n) {i++; sub($1 FS"*", "")}; print $0}'

এবং উদাহরণস্বরূপ ফাইল foo.txt হিসাবে প্রক্রিয়া করার জন্য যদি আপনার আরও লাইন থাকে তবে আমি 0 এ পুনরায় সেট করতে ভুলবেন না:

$ awk -v n=3 '{i=0; while (i<n) {i++; sub($1 FS"*", "")}; print $0}' foo.txt

ধন্যবাদ আপনার ফোরাম


0

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

আমার একটি লগ রয়েছে যেখানে আইপি ঠিকানা সহ $ 5 এর পরে আরও পাঠ্য হতে পারে বা কোনও পাঠ্য হতে পারে না। আইপি ঠিকানা থেকে শুরু করে লাইনের শেষ পর্যন্ত আমার সবকিছু দরকার $ 5 এর পরে কিছু থাকা উচিত। আমার ক্ষেত্রে, এটি বাস্তবতই একটি অ্যাডাব্লিক প্রোগ্রাম সহ, কোনও অ্যাজক অনেলাইনার নয়, তাই এইডকে অবশ্যই সমস্যার সমাধান করতে হবে। আমি যখন পুরানো সুন্দর চেহারা এবং সর্বাধিক উত্সাহিত কিন্তু সম্পূর্ণ ভুল উত্তরটি ব্যবহার করে প্রথম 4 টি ক্ষেত্র সরিয়ে দেওয়ার চেষ্টা করি:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218 one two three" | awk '{$1=$2=$3=$4=""; printf "[%s]\n", $0}'

এটি ভুল এবং অকেজো সাড়া ফেলে দেয় (আমি প্রদর্শন করতে [] যোগ করেছি):

[    37.244.182.218 one two three]

পরিবর্তে, যদি কাট পয়েন্ট এবং অ্যাডাব্লিক প্রয়োজন না হওয়া অবধি কলামগুলি প্রস্থ স্থির করে থাকে তবে সঠিক এবং বেশ সহজ উত্তরটি হ'ল:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218 one two three" | awk '{printf "[%s]\n", substr($0,28)}'

যা কাঙ্ক্ষিত আউটপুট উত্পাদন করে:

[37.244.182.218 one two three]

0

আমি এই অন্যান্য সম্ভাবনাটি পেয়েছি, সম্ভবত এটি দরকারীও হতে পারে ...

awk 'BEGIN {OFS=ORS="\t" }; {for(i=1; i<14; i++) print $i " "; print $NF "\n" }' your_file

দ্রষ্টব্য: ১. টেবুলার ডেটার জন্য এবং কলাম $ 1 থেকে 14 ডলার


0

ব্যবহার কাটা:

cut -d <The character between characters> -f <number of first column>,<number of last column> <file name>

যেমন: যদি আপনার থাকে file1:car.is.nice.equal.bmw

চালান: cut -d . -f1,3 file1 মুদ্রণ করবেcar.is.nice


আপনার সমাধানটি পিছনে হতে পারে বলে মনে হচ্ছে। দয়া করে প্রশ্নের শিরোনামটি পর্যালোচনা করুন * তবে প্রথম তিনটি কলামকে প্রিন্ট করুন
স্টিফান ক্রেন

-1

এটি পূর্বের কয়েকটি উত্তর থেকে খুব বেশি দূরে নয়, তবে কয়েকটি সমস্যার সমাধান করে:

cols.sh:

#!/bin/bash
awk -v s=$1 '{for(i=s; i<=NF;i++) printf "%-5s", $i; print "" }'

যা আপনি এখন একটি যুক্তি দিয়ে কল করতে পারেন যা শুরুর কলাম হবে:

$ echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 3 
3    4    5    6    7    8    9    10   11   12   13   14

বা:

$ echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 7 
7    8    9    10   11   12   13   14

এটি 1-সূচকযুক্ত; আপনি যদি শূন্য সূচকে পছন্দ করেন তবে i=s + 1পরিবর্তে ব্যবহার করুন।

তদতিরিক্ত, আপনি যদি সূচনা সূচনা এবং শেষ সূচকটির পক্ষে যুক্তি দিতে চান তবে ফাইলটি এতে পরিবর্তন করুন:

#!/bin/bash
awk -v s=$1 -v e=$2 '{for(i=s; i<=e;i++) printf "%-5s", $i; print "" }'

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

$ echo "1 2 3 4 5 6 7 8 9 10 11 12 13 14" | ./cols.sh 7 9 
7    8    9

%-5sপ্রান্তিক 5-অক্ষর-ব্যাপী কলাম হিসাবে ফলাফলের; যদি এটি পর্যাপ্ত না হয় তবে সংখ্যাটি বাড়ান, বা %sপরিবর্তিতকরণের বিষয়ে চিন্তা না করে পরিবর্তে (একটি স্থান সহ) ব্যবহার করুন।


-1

AWK প্রিন্টফ ভিত্তিক সমাধান যা% সমস্যা এড়ায়, এবং এটি অনন্য যে এতে 4 টিরও কম কলাম মুদ্রণ করতে না পারলে (কিছুই প্রত্যাবর্তন অক্ষর নেই) দেয়:

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

পরীক্ষামূলক:

$ x='1 2 3 %s 4 5 6'
$ echo "$x" | awk 'NF > 3 { for(i=4; i<NF; i++) printf("%s ", $(i)); print $(i) }'
%s 4 5 6
$ x='1 2 3'
$ echo "$x" | awk 'NF > 3 { for(i=4; i<NF; i++) printf("%s ", $(i)); print $(i) }'
$ x='1 2 3 '
$ echo "$x" | awk 'NF > 3 { for(i=4; i<NF; i++) printf("%s ", $(i)); print $(i) }'
$
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.