প্রথম ক্ষেত্রটি বাদ দিয়ে বাকী কিছু মুদ্রণ করা হচ্ছে


108

আমার কাছে এমন ফাইল রয়েছে যা দেখে মনে হচ্ছে:

AE  United Arab Emirates
AG  Antigua & Barbuda
AN  Netherlands Antilles
AS  American Samoa
BA  Bosnia and Herzegovina
BF  Burkina Faso
BN  Brunei Darussalam

এবং আমি প্রথমে $ 1 এবং তারপরে $ 1 ব্যতীত সমস্ত কিছু মুদ্রণ করে অর্ডারটি উল্টাতে চাই:

United Arab Emirates AE

আমি কীভাবে "ক্ষেত্র 1 বাদে সবকিছু" কৌশল করতে পারি?


2
হাই @ কফিশার, অতিরিক্ত স্থান ছাড়াই এটি লুপ অ্যাং ছাড়াই করা যায়।
জুয়ান দিয়েগো গডয় রোবলস

উত্তর:


91

$1কাজ বরাদ্দ করা কিন্তু এটি একটি শীর্ষস্থানীয় স্থান ছেড়ে যাবে:awk '{first = $1; $1 = ""; print $0, first; }'

আপনি কলামগুলির সংখ্যাও খুঁজে পেতে এবং এটিকে NFএকটি লুপে ব্যবহার করতে পারেন।


2
সম্পূর্ণ অলস জন্য; এখানে ক্লাশএক্সএক্স কোড
সার্জ Stroobandt

1
গ্রেট। awk {'first = $1; $1=""; print $0'}|sed 's/^ //g'
শীর্ষের

ভিআইএম 'সিআরটিএল + ভি জিডি' স্বাভাবিক মোডে চাপলে স্পেসটি সহজেই সরিয়ে ফেলা হয়
সান্তি

107

$1=""বেন জ্যাকসন যেমন উল্লেখ করেছেন তেমন একটি স্থান ছেড়ে যায়, সুতরাং একটি forলুপ ব্যবহার করুন :

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

সুতরাং আপনার স্ট্রিং যদি "এক দুই তিন" হয় তবে আউটপুটটি হবে:

দুই
তিন

আপনি যদি এক সারিতে ফলাফল চান, আপনি নিম্নলিখিত হিসাবে করতে পারেন:

awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}' filename

এটি আপনাকে দেবে: "দুই তিন"


4
এবং একটি অতিরিক্ত
ট্রেলিং

2
আরও ভাল ব্যবহার করুন: awk '{for(i=2;i<=NF;i++){ printf("%s",( (i>2) ? OFS : "" ) $i) } ; print ;}' যা: 2 টি এনএফ থেকে ক্ষেত্রগুলি মুদ্রণ করুন, প্রয়োজন অনুযায়ী আউটপুট ফিল্ড বিভাজক যুক্ত করুন (যেমন, $ 2 এর আগে ব্যতীত)। শেষ মুদ্রণটি বর্তমান লাইন প্রিন্টিং শেষ করতে একটি চূড়ান্ত নিউলাইন যুক্ত করে। আপনি যদি এফএস / ওএফএস পরিবর্তন করেন (তবে এটি সর্বদা "স্থান" হবে না)
অলিভিয়ার ডুলাক

দ্বিতীয়টি আমার পক্ষে সত্যই চমৎকার কাজ করেছে। প্রথমটি, এতটা নয়। সত্যিই নিশ্চিত নয় কেন। এটি সম্পূর্ণ পাঠ্য সজ্জিত।
ভয়েসেস রয়েছে

72

বিকল্পটি cutসহ কমান্ডটি ব্যবহার করুন --complement:

$ echo a b c | cut -f 1 -d ' '
a
$ echo a b c | cut -f 1,2 -d ' '
a b
$ echo a b c | cut -f 1 -d ' ' --complement
b c

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

19
echo a b c | cut -d' ' -f 2- একটি বিকল্প
লুইস

2
সুন্দর - @ লুইস সমাধান ম্যাকের জন্য কাজ করে, যা
কমপ্লিট

21

সম্ভবত সবচেয়ে সংক্ষিপ্ত উপায়:

$ awk '{$(NF+1)=$1;$1=""}sub(FS,"")' infile
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

ব্যাখ্যা:

$(NF+1)=$1: একটি "নতুন" শেষ ক্ষেত্রের জেনারেটর।

$1="": আসল প্রথম ক্ষেত্রটি শূন্য করতে সেট করুন

sub(FS,""): প্রথম দুটি ক্রিয়া {$(NF+1)=$1;$1=""}সাব ব্যবহার করে প্রথম ক্ষেত্র বিভাজক থেকে মুক্তি পান। চূড়ান্ত মুদ্রণ অন্তর্নিহিত।


13
awk '{sub($1 FS,"")}7' YourFile

প্রথম ক্ষেত্র এবং বিভাজক সরান, এবং ফলাফল মুদ্রণ করুন ( 7একটি শূন্য মানের হয় তাই printing 0 মুদ্রণ)।


সর্বোত্তম উত্তর! সম্মত। কীভাবে এটি ব্যবহার করা থেকে আলাদা 1? আমি এই প্যাটার্নটির ব্যবহারটি অবাক করেছিলাম এবং এটি বুঝতে চেয়েছিলাম। ধন্যবাদ!
অভিজিৎ রাস্তোগি

10
awk '{ saved = $1; $1 = ""; print substr($0, 2), saved }'

প্রথম ক্ষেত্রটি সেট করার শুরুতে ""একক অনুলিপি ছেড়ে OFSদেয় $0। ধরে নিলাম যে OFSএটি কেবল একটি একক অক্ষর (ডিফল্টরূপে এটি একটি একক স্থান), আমরা এটির সাহায্যে এটি সরাতে পারি substr($0, 2)। তারপরে আমরা এর সংরক্ষিত অনুলিপি সংযোজন করব $1


6

আপনি যদি পার্ল সমাধানের জন্য উন্মুক্ত হন ...

perl -lane 'print join " ",@F[1..$#F,0]' file

একটি স্থানের একটি ইনপুট / আউটপুট বিভাজক সহ একটি সহজ সমাধান যা উত্পন্ন করে:

United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

এর পরেরটি কিছুটা জটিল

perl -F`  ` -lane 'print join "  ",@F[1..$#F,0]' file

এবং ধরে নেওয়া হয় যে ইনপুট / আউটপুট বিভাজক দুটি স্পেস:

United Arab Emirates  AE
Antigua & Barbuda  AG
Netherlands Antilles  AN
American Samoa  AS
Bosnia and Herzegovina  BA
Burkina Faso  BF
Brunei Darussalam  BN

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

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

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

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

  • -F অটোস্প্লিট সংশোধক, এই উদাহরণে '' (দুটি স্পেস) এ বিভক্ত হয়

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

@Fপ্রতিটি লাইনের শব্দের অ্যারে, 0 দিয়ে সূচকযুক্ত
$#Fশব্দের সংখ্যা @F
@F[1..$#F]হ'ল শেষ এলিমেন্টের মধ্য দিয়ে 1 এলিমেন্টের
@F[1..$#F,0]অ্যারের স্লাইসটি শেষ এলিমেন্টের যোগফল এলিমেন্ট 0 এর মধ্য দিয়ে এলিমেন্ট 1 এর অ্যারে ফালি হয় 0


1
আমি এটি চালিয়েছি এবং শেষে একটি অতিরিক্ত সংখ্যা ছিল তাই আমি এই সংস্করণটি ব্যবহার করেছি: পার্ল-লেন 'শিফট @ এফ; মুদ্রণ যোগদান "", @ এফ '
হ্যানস পু

2

গাওকের ক্ষেত্রের বিভাজক (কমপক্ষে) একটি স্ট্রিং পাশাপাশি একটি অক্ষরও হতে পারে (এটি একটি রেজেক্সও হতে পারে)। যদি আপনার ডেটা সামঞ্জস্যপূর্ণ হয়, তবে এটি কাজ করবে:

awk -F "  " '{print $2,$1}' inputfile

এটি দ্বিগুণ উদ্ধৃতিগুলির মধ্যে দুটি স্পেস।


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

@ ড্যানমোল্ডিং: যতক্ষণ না ফাইল দুটি কোড স্পেসের সাথে দেশের কোড পৃথক করতে সামঞ্জস্যপূর্ণ এবং দুটি জায়গার একসাথে অন্য কোনও ঘটনা উপস্থিত না থাকে, আমার উত্তরটি প্রশ্নের উত্তর দেয়
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

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


2

আসুন সমস্ত রেকর্ড পরেরটিতে সরানো যাক এবং সর্বশেষটি প্রথম হিসাবে সেট করুন:

$ awk '{a=$1; for (i=2; i<=NF; i++) $(i-1)=$i; $NF=a}1' file
United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

ব্যাখ্যা

  • a=$1 অস্থায়ী ভেরিয়েবলের মধ্যে প্রথম মানটি সংরক্ষণ করুন।
  • for (i=2; i<=NF; i++) $(i-1)=$i (N-1) তম ক্ষেত্রে Nth ক্ষেত্রের মান সংরক্ষণ করুন।
  • $NF=aপ্রথম $1ক্ষেত্রের মধ্যে প্রথম মান ( ) সংরক্ষণ করুন ।
  • {}1করতে প্রকৃত অবস্থা awkডিফল্ট অ্যাকশন পালন করুন: {print $0}

এইভাবে, যদি আপনার অন্য ক্ষেত্রের বিভাজক ঘটে থাকে তবে ফলাফলটিও ভাল:

$ cat c
AE-United-Arab-Emirates
AG-Antigua-&-Barbuda
AN-Netherlands-Antilles
AS-American-Samoa
BA-Bosnia-and-Herzegovina
BF-Burkina-Faso
BN-Brunei-Darussalam

$ awk 'BEGIN{OFS=FS="-"}{a=$1; for (i=2; i<=NF; i++) $(i-1)=$i; $NF=a}1' c
United-Arab-Emirates-AE
Antigua-&-Barbuda-AG
Netherlands-Antilles-AN
American-Samoa-AS
Bosnia-and-Herzegovina-BA
Burkina-Faso-BF
Brunei-Darussalam-BN

1

এটি দেখে প্রথমে ছুরিকাঘাত করা আপনার বিশেষ ক্ষেত্রে কাজ করে বলে মনে হচ্ছে।

awk '{ f = $1; i = $NF; while (i <= 0); gsub(/^[A-Z][A-Z][ ][ ]/,""); print $i, f; }'

1

বিকল্প 1

এমন একটি সমাধান রয়েছে যা কয়েকটি সংস্করণের সাথে কাজ করে:

awk '{ $(NF+1)=$1;$1="";$0=$0;} NF=NF ' infile.txt

ব্যাখ্যা:

       $(NF+1)=$1                          # add a new field equal to field 1.
                  $1=""                    # erase the contents of field 1.
                        $0=$0;} NF=NF      # force a re-calc of fields.
                                           # and use NF to promote a print.

ফলাফল:

United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

তবে এটি awk এর পুরানো সংস্করণগুলির সাথে ব্যর্থ হতে পারে।


বিকল্প 2

awk '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt

এটাই:

awk '{                                      # call awk.
       $(NF+1)=$1;                          # Add one trailing field.
                  $1="";                    # Erase first field.
                        sub(OFS,"");        # remove leading OFS.
                                    }1'     # print the line.

নোট করুন যে যা মুছতে হবে তা হ'ল অফস, এফএস নয়। ক্ষেত্র $ 1 স্বাক্ষরিত হলে রেখাটি পুনরায় গণনা করে। এটি এফএসের সমস্ত রানকে একটি ওএফএসে পরিবর্তন করে।


তবে এমনকি সেই বিকল্পটি এখনও বেশ কয়েকটি ডিলিমিটারের সাথে ব্যর্থ হয়, যেমন স্পষ্টভাবে অফসটি পরিবর্তন করে দেখানো হয়েছে:

awk -v OFS=';' '{ $(NF+1)=$1;$1="";sub(OFS,"");}1' infile.txt

এই লাইন আউটপুট হবে:

United;Arab;Emirates;AE
Antigua;&;Barbuda;AG
Netherlands;Antilles;AN
American;Samoa;AS
Bosnia;and;Herzegovina;BA
Burkina;Faso;BF
Brunei;Darussalam;BN

এটি প্রকাশ করে যে এফএসের রানগুলি একটি ওএফএসে পরিবর্তন করা হচ্ছে।
এড়াতে একমাত্র উপায় হ'ল ক্ষেত্রটির পুনরায় গণনা এড়ানো।
একটি ফাংশন যা পুনরায় গণনা এড়াতে পারে তা হ'ল সাব।
প্রথম ক্ষেত্রটি ক্যাপচার করা যায়, তারপরে সাব দিয়ে with 0 থেকে সরানো যায় এবং তারপরে উভয়ই আবার মুদ্রিত হয়।

বিকল্প 3

awk '{ a=$1;sub("[^"FS"]+["FS"]+",""); print $0, a;}' infile.txt
       a=$1                                   # capture first field.
       sub( "                                 # replace: 
             [^"FS"]+                         # A run of non-FS
                     ["FS"]+                  # followed by a run of FS.
                            " , ""            # for nothing.
                                  )           # Default to $0 (the whole line.
       print $0, a                   # Print in reverse order, with OFS.


United Arab Emirates AE
Antigua & Barbuda AG
Netherlands Antilles AN
American Samoa AS
Bosnia and Herzegovina BA
Burkina Faso BF
Brunei Darussalam BN

এমনকি যদি আমরা এফএস, ওএফএস এবং / বা আরও সীমানা যুক্ত করি তবে এটি কার্যকর হয়।
যদি ইনপুট ফাইলটি এতে পরিবর্তন করা হয়:

AE..United....Arab....Emirates
AG..Antigua....&...Barbuda
AN..Netherlands...Antilles
AS..American...Samoa
BA..Bosnia...and...Herzegovina
BF..Burkina...Faso
BN..Brunei...Darussalam

কমান্ডটি এতে পরিবর্তন হয়:

awk -vFS='.' -vOFS=';' '{a=$1;sub("[^"FS"]+["FS"]+",""); print $0,a;}' infile.txt

আউটপুটটি হবে (এখনও সীমান্ত সংরক্ষণকারী):

United....Arab....Emirates;AE
Antigua....&...Barbuda;AG
Netherlands...Antilles;AN
American...Samoa;AS
Bosnia...and...Herzegovina;BA
Burkina...Faso;BF
Brunei...Darussalam;BN

কমান্ডটি বেশ কয়েকটি ক্ষেত্রে প্রসারিত হতে পারে তবে কেবল আধুনিক জাদাগুলির সাথে এবং --re-interval বিকল্প সক্রিয় রয়েছে। মূল ফাইলটিতে এই আদেশ:

awk -vn=2 '{a=$1;b=$2;sub("([^"FS"]+["FS"]+){"n"}","");print $0,a,b;}' infile.txt

এটি আউটপুট দেবে:

Arab Emirates AE United
& Barbuda AG Antigua
Antilles AN Netherlands
Samoa AS American
and Herzegovina BA Bosnia
Faso BF Burkina
Darussalam BN Brunei


0

সেড অপশনও আছে ...

 sed 's/\([^ ]*\)  \(.*\)/\2 \1/' inputfile.txt

বুঝিয়ে বলেছিল ...

Swap
\([^ ]*\) = Match anything until we reach a space, store in $1
\(.*\)    = Match everything else, store in $2
With
\2        = Retrieve $2
\1        = Retrieve $1

আরও পুঙ্খানুপুঙ্খভাবে ব্যাখ্যা করা হয়েছে ...

s    = Swap
/    = Beginning of source pattern
\(   = start storing this value
[^ ] = text not matching the space character
*    = 0 or more of the previous pattern
\)   = stop storing this value
\(   = start storing this value
.    = any character
*    = 0 or more of the previous pattern
\)   = stop storing this value
/    = End of source pattern, beginning of replacement
\2   = Retrieve the 2nd stored value
\1   = Retrieve the 1st stored value
/    = end of replacement

0

আরও একটি উপায় ...

... এটি এফএস দিয়ে 2 টি এনএফ মাধ্যমে ক্ষেত্রগুলিতে পুনরায় যোগদান করে এবং ইনপুট প্রতি লাইন এক লাইন আউটপুট দেয়

awk '{for (i=2;i<=NF;i++){printf $i; if (i < NF) {printf FS};}printf RS}'

আমি আমার কাজের ডিয়ারে কোন ফাইলগুলি সংশোধন করা হয়েছে তা দেখতে গিট দিয়ে এটি ব্যবহার করি:

git diff| \
    grep '\-\-git'| \
    awk '{print$NF}'| \
    awk -F"/" '{for (i=2;i<=NF;i++){printf $i; if (i < NF) {printf FS};}printf RS}'

-3

বিড়াল কমান্ড ব্যবহার করার আরেকটি এবং সহজ উপায়

cat filename | awk '{print $2,$3,$4,$5,$6,$1}' > newfilename

আমি হ্রাস পেয়েছি কারণ এটি একটি গতিশীল পদ্ধতির নয়। এটির সাথে আপনাকে আর্গুমেন্টের সংখ্যা জানতে হবে এবং ধরে নেওয়া উচিত যে আপনার ডেটাটি সামঞ্জস্যপূর্ণ। ডেটা প্রায় সামঞ্জস্যপূর্ণ হয় না এবং আপনার পদ্ধতির অবশ্যই এটি বেশিরভাগ সময় বিবেচনা করা উচিত।
xh3b4sd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.