উত্তর:
-Fবিকল্প একটি আর্গুমেন্ট দরকার: -F,উদাহরণস্বরূপ।
শেষে awkস্ক্রিপ্ট একটি দিয়ে পৃথক করা আবশ্যক পরামিতি বাকি সঙ্গে (স্থান গৃহস্থালির কাজ)।
যদি ক্ষেত্রের বিভাজক হয় ,এবং আপনি এটি রাখতে চান এবং যদি কলামের সংখ্যা স্থির হয় এবং 11 এর চেয়ে কম বা এর সমান হয় তবে এটি চেষ্টা করে দেখুন:
awk -F, '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' OFS=, "$file"
command file > newfile && mv newfile file। যে বলেন, গনুহ এর নতুন সংস্করণ awkএই সমর্থন করার জন্য: gawk -i inplace '{blah blah}' file।
mv newfile fileআপনি ব্যবহার করতে পারেন cat newfile > file ; rm -f newfile- এটি এর ইনোড এবং অনুমতি সংরক্ষণ করে file।
mktempস্ক্রিপ্টগুলিতে অস্থায়ী ফাইলের নামগুলি হার্ড-কোডিংয়ের পরিবর্তে ব্যবহার করা ভাল । যেমনtf=$(mktemp) ; command file > "$tf" ; cat "$tf" > file ; rm -f "$tf"
সংক্ষিপ্ত সমাধান হবে
awk -F',+' -v OFS=, '{$(NF+1)=$7; $7=""; $0=$0; $1=$1}1' file
আমি নিশ্চিত না যে ,+সমস্ত awkসংস্করণে কাজ করবে কিনা , তবে কমপক্ষে জিএনইউ -cঅ্যাড-এ কাজ করে omp
ব্যাখ্যা:
$(NF+1)=$7: প্রথমে আমরা লাইনের শেষে 7 তম ক্ষেত্র যুক্ত করব ( $12=$7এই ক্ষেত্রে হতে পারে )$7="": পরবর্তী ধাপে 7th ম ক্ষেত্রটি মুছে ফেলা হয়েছে (তবে আশেপাশের সীমানা বিহীন)$0=$0একাধিক কমাতে ক্ষেত্র বিভাজক হিসাবে আচরণ করার মাধ্যমে পুরো রেকর্ডটি পুনরায় সেট করতে হবে ( এটি এর মাধ্যমে করা হয় -F',+', এখানে +এক বা একাধিক বার বোঝানো হয়েছে), এবং $1=$1পূর্ববর্তী সেট আউটপুট ক্ষেত্রটি ব্যবহার করে লাইনটি পুনর্নির্মাণের জন্য বর্তমান রেকর্ডটিকে পুনর্বিন্যাস করা দরকার বিভাজক (একটি বিকল্প দ্বারা সেট -v OFS=,)1উদাহরণ ইনপুট:
1,2,3,4,5,6,7,8,9,10,11
আউটপুট
1,2,3,4,5,6,8,9,10,11,7
,+কাজ করা উচিত।
all,ball,call,,,fall→ all,ball,call,fall)। (2) $(NF+1)=$7একটি চতুর পদ্ধতির। আইএমএইচও, আরও $0 = $0 OFS $7পরিষ্কার, কেবলমাত্র কয়েকটি অক্ষর দীর্ঘ, এবং মনে হয় এটি একই কাজ করবে। আপনি কি এমন পরিস্থিতি সম্পর্কে ভাবতে পারেন যা $0 = $0 OFS $7আপনার কোডের মতো করে না?
$0=$0 OFS $7সম্ভবত এটির জন্য অভিন্ন $(NF+1)=$7, তবে কেবলমাত্র কোডটি অপরিবর্তিত রয়েছে, সাধারণভাবে নয়।
আপনি যদি মুদ্রণ করছেন OFS=, তাই ক্ষেত্রগুলির মধ্যে কোনও বিভাজক না থাকলে আপনি কেবল $7ভেরিয়েবলের মান সংরক্ষণ করতে পারেন , $7খালি সেট করে লাইনটি এবং ভেরিয়েবলটি সরাসরি মুদ্রণ করতে পারেন। আপনাকে সমস্ত ক্ষেত্র নির্দিষ্ট করার দরকার নেই:
$ cat file
1,2,3,4,5,6,7,8
$ awk -F, -vOFS= '{k=$7; $7=""; print $0,k}' file
12345687
আপনার সম্ভবত সম্ভবত:
awk -F, -v OFS='' '{print $1,$2,$3,$4,$5,$6,$8,$9,$10,$11,$7}' "$file"
awkএকক উদ্ধৃতি কখনও দেখেন না OFS='', তাই না? আপনি পাশাপাশি টাইপ করতে পারেন OFS=; এটা ঠিক একই।
আপনি বিশদে নির্দিষ্টভাবে বলেননি যে আপনি বিশ্রী ব্যবহার করতে চেয়েছিলেন, এবং আপনি বলেছিলেন যে আপনি সরবরাহ করেছেন এমন জায়গায় স্থান সম্পাদনা ব্যবহার করতে চেয়েছিলেন sed -i, সুতরাং এখানে একটি sed -iবৈকল্পিক is awkকলামগুলির সাথে কাজ করার জন্য সাধারণত ভাল তবে এটি এমন একটি ক্ষেত্রে যেখানে আমি পছন্দ করি sedকারণ এটি স্বাভাবিকভাবেই সংখ্যক কলামগুলিকে পরিচালনা করে।
MOVECOL=7
N=$((MOVECOL-1))
sed -r -e "s/^(([^,]*,){$N})([^,]*),(.*)/\1\4,\3/" -i test.csv
ব্যাখ্যা:
-r প্রসারিত রিজেক্সপস নির্বাচন করে যাতে আমরা প্রচুর ব্যাকস্ল্যাশগুলি এড়ানো পারিঅবশ্যই এটি সেই ফাইলগুলির সাথে কাজ করবে না যা উদ্ধৃতিগুলিতে কমাগুলি লুকিয়ে রাখে (বা আরও খারাপ, সেগুলি থেকে পালাতে পারে), তবে কিছুটা গুরুতর অ্যাক্রোব্যাটিক্স ছাড়াই অজক এটি পরিচালনা করতে পারে না। আপনি যে সমস্যা আছে আপনার সাথে ভাল হতে চাই perlমডিউল Text:CSVবা pythonমডিউল csv।
বেশ কয়েকটি awkভেরিয়েন্ট (ধরে নিচ্ছেন আপনার ফাইলটি ভেরিয়েবলের মধ্যে রয়েছে $file)
এখানে আপনি সমস্ত কলুমনের জন্য চক্র রাখতে পারেন, ফিল্ড বিভাজক (ওএফএস) দিয়ে মুদ্রণ করতে পারেন এবং লাইনটির শেষে রেকর্ড টার্মিনেটর (ওআরএস) মুদ্রণ করতে পারেন।
awk -F',' -v OFS=, \
'{for(i=1;i<=NF;i++) if (i!=7) printf "%s",$i OFS; \
printf "%s",$7;printf ORS}' "$file"
এখানে একটি রেইজেক্স এবং gensub()ফাংশন ব্যবহার করে
gawk -F',+' -v OFS=, '{$0=gensub(/\s*\S+/,"",7) OFS $7}1' "$file"
হত্যা 7 ম ক্ষেত্র এবং লাইন শেষে এটা মুদ্রণ।
$0 পুরো রেকর্ড $nএটি এন ম রেকর্ড NF বর্তমান লাইনের ক্ষেত্র সংখ্যা is OFS আউটপুট বিভাজক ফাইলORS আউটপুট রেকর্ড টার্মিনেটর1trueডিফল্ট ( $0) মুছে ফেলা এবং মুদ্রণ করতে বলার কৌশল ।আপডেট করুন ...
আমি প্রায় ভুলে গেছি, 7 তম অনুসরণ করে সমস্ত কলামগুলি স্থানান্তর করা সম্ভব ।
awk -F',' -v OFS=, '{tmp=$7; for(i=7;i<=NF;i++) $i=$(i+1); $NF=tmp}1 ' "$file"
OFS $7চেয়ে আরও শক্তিশালী হবে "," $7। (২) আমি বিশ্বাস করি যে ", " $7এটি ভুল, ইনসোফার হিসাবে প্রশ্নটি ইঙ্গিত দেয় যে ওপি কমাগুলির পরে স্পেস চায় না। (এবং, যদি ইনপুট ডেটার কমাগুলির পরে ফাঁকা স্থান থাকে, তবে $7ইতিমধ্যে একটি স্পেস দিয়ে শুরু হবে, এবং আপনি একটি অতিরিক্ত যোগ করতে চাইবেন))
OFS $7কেবলমাত্র আরও
^কমান্ড যেখানে সমস্যা দেখা দিয়েছে নির্দিষ্ট অংশ নির্দেশ করে।