বিজোড়-সংখ্যাযুক্ত রেখাগুলি মুদ্রণ করুন, সমান সংখ্যাযুক্ত রেখা মুদ্রণ করুন


18

আমি ফাইলগুলি থেকে বিজোড় সংখ্যাযুক্ত এবং সমান সংখ্যাযুক্ত লাইনগুলি মুদ্রণ করতে চাই।

আমি এই শেল স্ক্রিপ্টটি পেয়েছি যা প্রতিধ্বনি ব্যবহার করে।

#!/bin/bash
# Write a shell script that, given a file name as the argument will write
# the even numbered line to a file with name evenfile and odd numbered lines
# in a text file called oddfile.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------

file=$1
counter=0

eout="evenfile.$$" # even file name
oout="oddfile.$$" # odd file name

if [ $# -eq 0 ]
then
    echo "$(basename $0) file"
    exit 1
fi

if [ ! -f $file ]
then
    echo "$file not a file"
    exit 2
fi

while read line
do
    # find out odd or even line number
    isEvenNo=$( expr $counter % 2 )

    if [ $isEvenNo -ne 0 ]
    then
        # even match
        echo $line >> $eout
    else
        # odd match
        echo $line >> $oout
    fi
    # increase counter by 1
    (( counter ++ ))
done < $file
echo "Even file - $eout"
echo "Odd file - $oout"

কিন্তু এটি এক লাইনে করার উপায় নেই?

হ্যাঁ, কুয়াশা ব্যবহার করুন, আমি পড়েছি।

সমান সংখ্যাযুক্ত রেখা:

awk 'NR % 2' filename

বিজোড় সংখ্যাযুক্ত রেখা:

awk 'NR % 2 == 1' filename

তবে এটি আমার পক্ষে কাজ করে না। উভয় পৃথক অনুযায়ী একই আউটপুট উত্পাদন করে। মূল ফাইলের সাথে তুলনা করা হলে এগুলি উভয়ই অর্ধেক লম্বা এবং তারা উভয়ই বিজোড়-সংখ্যাযুক্ত লাইন ধারণ করে। আমি কি ভুল কিছু করছি?


6
প্রথমটি হওয়া উচিত NR % 2 == 0, অন্যথায় এটি দ্বিতীয়টির সমান।
এনজোটিব

অনলাইনে বেশ কয়েকটি ডকুমেন্ট রয়েছে বলে মনে হয় (এটি সহ) একটি অনুসন্ধানের শীর্ষে দেখানো হয়েছে যে এনআর% 2 আপনাকে সমান সংখ্যাযুক্ত রেখা দেয় যা সঠিক নয়, এটি আপনাকে বিজোড় দেয় কারণ 1% 2 = 1 = সত্য, 2% 2 = 0 = মিথ্যা।
ডেল্টারে

উত্তর:


12

আপনি যেমন "এক লাইনে" জিজ্ঞাসা করেছেন:

awk '{print>sprintf("%sfile.%d",NR%2?"odd":"even",PROCINFO["pid"])}' filename

নোট করুন যে কোডটির বেশিরভাগটি আপনার অভিনব আউটপুট ফাইল নাম পছন্দের কারণে। অন্যথায় নিম্নলিখিত কোডটি "লাইন -1" তে বিজোড় লাইন এবং "লাইন -0" তে এমনকি লাইন রাখার জন্য যথেষ্ট হবে:

awk '{print>"line-"NR%2}' filename

26

আমি যখনই সম্ভব পসিএক্স সামঞ্জস্যপূর্ণ হতে পছন্দ করি, তাই আমি ভেবেছিলাম এই বিকল্প পদ্ধতিটি পোস্ট করব post আমি প্রায়শই xargsপাইপলাইনগুলির আগে, মঙ্গলের পাঠ্যে এটি ব্যবহার করি ।

এমনকি অঙ্কিত লাইনগুলি মুদ্রণ করুন,

sed -n 'n;p'

অদ্ভুত সংখ্যাযুক্ত লাইনগুলি মুদ্রণ করুন,

sed -n 'p;n'

যদিও আমি প্রায়শই ব্যবহার করি তবে awkএটি এই ধরণের কাজের জন্য ওভারকিল।


14

এটা সহজ:

 sed -n 2~2p filename

ফাইলের নাম থেকে সম-সংখ্যাযুক্ত লাইনগুলি মুদ্রণ করবে

sed -n 1~2p filename

বিজোড় সংখ্যাযুক্ত রেখা মুদ্রণ করবে।


1
+1, বহিরাগতভাবে AWK ব্যবহার না করার জন্য। পসিক্স সেড নয়, তবে এটি এখনও শক্ত পদ্ধতি।
জেএম বেকার 14

@ টেকজিলা আমি "এডাব্লুকে বহির্মুখীভাবে ব্যবহার করা" বুঝতে পারি না - অ্যাডও পজিক্সও।
jw013

3
@ jw013: কিছুতেই ভুল হয় না awk, ব্যক্তিগতভাবে আমি এটি প্রায়শই ব্যবহার করি। আমি কখনই 'পটিক্স নয়' এমন কিছু বলিনি awk, আমি উত্তরের sedবিকল্পগুলি উল্লেখ করছি । বিশেষত ~অপারেটর, এটি একটি GNU এক্সটেনশন, যা এখনও অনেক লোকের কাছে গ্রহণযোগ্য। , I personally believe using এই সাধারণ কাজের জন্য ' বাহ্যিকভাবে অ্যাডাব্লুকে ' ব্যবহার করা ওভারকিল Regarding সুতরাং +1 এর সাথে টাস্কটি সম্পন্ন করার জন্য ছিল sed, তার চেয়ে হালকা ইউটিলিটি awk
জেএম বেকার

1
Please অপারেটর এখানে কীভাবে কাজ করে তা দয়া করে কেউ ব্যাখ্যা করতে পারেন?
চিরকালীন শিক্ষার্থী

9

এমনকি সংখ্যার জন্য কোড হওয়া উচিত

awk 'NR%2==0' filename

বিজোড় সংখ্যার জন্য

awk 'NR%2==1' filename

1
এই এক নিখুঁত। এমনকি যদি আপনার 10 বার বৃদ্ধি পেতে সারি পেতে হয় তবেও কাজ করে, বলুন আপনাকে 1 মিলিয়ন সাইজের একটি অর্ডার করা ফাইল হ্রাস করতে হবে। আমি ঠিক তাই চেয়েছিলাম
ডেক্সটার

আপনি কীভাবে সমেত সংখ্যাযুক্ত কলামগুলি এডাব্লু-তে মুদ্রণ করতে পারেন? আমি এই কাজ পেতে পারি না gawk 'FS=",";NF%2==0' file.csv
hhh

2

আপনি এটি একক sedঅনুরোধের মাধ্যমে করতে পারেন, ফাইলটি দুবার পড়ার দরকার নেই:

sed '$!n
w even
d' infile > odd

বা, যদি আপনি এক লাইনে পছন্দ করেন:

sed -e '$!n' -e 'w even' -e d infile > odd

নোট করুন যে কোনও ফাইলে যদি কেবল একটি লাইন থাকে তবে ( প্রথমটি কার্যকর না wহওয়ার evenপরিবর্তে লাইনটি সরানো হবে) এতে প্রত্যাশিত ফলাফলটি দেওয়া হবে না । এড়াতে, একটি শর্ত যুক্ত করুন:oddn

sed -e '$!n' -e '1!{w even' -e 'd}' infile > odd

কিভাবে এটা কাজ করে ? ঠিক আছে, এটিতে তিনটি sedকমান্ড ব্যবহার করা হয়েছে :
n- যদি শেষ লাইনে না হয় তবে প্যাটার্ন স্পেসটি প্রিন্ট করুন stdout(যা ফাইলটিতে পুনঃনির্দেশিত করা হয়েছে odd), এটি পরবর্তী লাইনের সাথে প্রতিস্থাপন করুন (সুতরাং এখন এটি একটি এমনকি লাইন প্রসেস করছে) এবং অবশিষ্ট কমান্ডগুলি চালিয়ে যেতে হবে
w- সংযোজন ফাইল করার জন্য প্যাটার্ন স্পেস even
d- বর্তমান প্যাটার্ন স্পেস মুছুন এবং চক্রটি পুনরায় আরম্ভ করুন - এর পার্শ্ব প্রতিক্রিয়া হ'ল sedএটি কখনই স্ক্রিপ্টের শেষে পৌঁছায় না বলে প্যাটার্ন স্পেসটি স্বয়ংক্রিয়ভাবে মুদ্রণ করবে না

অন্য কথায়, nশুধুমাত্র বিজোড় লাইন মৃত্যুদন্ড কার্যকর করা হয় এবং wএবং dশুধুমাত্র এমনকি লাইন মৃত্যুদন্ড কার্যকর করা হয়। sedযেমনটি আমি বলেছি, ইনপুটটিতে একটি একক লাইন থাকে না তা না হলে কখনও কখনও অটোপ্রিন্টে যায় না।


আপনি কিভাবে দয়া করে বিস্তারিত বলতে পারেন?
চিরকালীন শিক্ষার্থী

আপনার সহায়তার জন্য অনেক ধন্যবাদ_ আন্তরিকভাবে এটি প্রশংসা করুন, পাশাপাশি উন্নত।
চিরকালীন শিক্ষার্থী

0

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

awk '{if(NR%2){print $0 > "odd.file"}else{print $0 > "even.file"}}' filename

আপনি কি রেকর্ড নম্বর আউটপুট দেওয়ার বিষয়ে নিশ্চিত?
manatwork

এর জন্য দুঃখিত, আমি এটি সম্পূর্ণ লাইন আউটপুট পরিবর্তন।
রেনমা

0

আমি perlপছন্দ করি কারণ আমি যেতে চাই perl:

perl -pe 'BEGIN{open($e,">even_lines");open($o,">odd_lines")} $. % 2 ?select $o:select $e;'

ব্যবহার সত্য যে -pপরোক্ষভাবে প্রিন্ট, প্রতিলিপি কিভাবে sedকাজ - এবং আমরা ব্যবহার selectযা ফাইল হাতল যা তা লিখেছেন পছন্দ করে নিন।

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