awk '
{
for (i=1; i<=NF; i++) {
a[NR,i] = $i
}
}
NF>p { p = NF }
END {
for(j=1; j<=p; j++) {
str=a[1,j]
for(i=2; i<=NR; i++){
str=str" "a[i,j];
}
print str
}
}' file
আউটপুট
$ more file
0 1 2
3 4 5
6 7 8
9 10 11
$ ./shell.sh
0 3 6 9
1 4 7 10
2 5 8 11
জোনাথন 10000 লাইনের ফাইলে পার্ল সমাধানের বিপরীতে অভিনয়
$ head -5 file
1 0 1 2
2 3 4 5
3 6 7 8
4 9 10 11
1 0 1 2
$ wc -l < file
10000
$ time perl test.pl file >/dev/null
real 0m0.480s
user 0m0.442s
sys 0m0.026s
$ time awk -f test.awk file >/dev/null
real 0m0.382s
user 0m0.367s
sys 0m0.011s
$ time perl test.pl file >/dev/null
real 0m0.481s
user 0m0.431s
sys 0m0.022s
$ time awk -f test.awk file >/dev/null
real 0m0.390s
user 0m0.370s
sys 0m0.010s
এড মর্টন দ্বারা সম্পাদিত সম্পাদনা (আপনি যদি অস্বীকার করেন তবে @ ghostdog74 নির্দ্বিধায় মুক্ত হন)।
সম্ভবত আরও কিছু স্পষ্ট পরিবর্তনশীল নাম সহ এই সংস্করণটি নীচের কয়েকটি প্রশ্নের উত্তর দিতে এবং স্ক্রিপ্টটি কী করছে তা সাধারণত পরিষ্কার করতে সহায়তা করবে। এটি পৃথককারী হিসাবে ট্যাবগুলিও ব্যবহার করে যা ওপি মূলত অনুরোধ করেছিল যাতে এটি খালি ক্ষেত্রগুলি পরিচালনা করতে পারে এবং এটি কাকতালীয়ভাবে বিশেষ ক্ষেত্রে এই বিশেষ ক্ষেত্রে আউটপুটটি সামান্যই আপ করতে পারে।
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
for (rowNr=1;rowNr<=NF;rowNr++) {
cell[rowNr,NR] = $rowNr
}
maxRows = (NF > maxRows ? NF : maxRows)
maxCols = NR
}
END {
for (rowNr=1;rowNr<=maxRows;rowNr++) {
for (colNr=1;colNr<=maxCols;colNr++) {
printf "%s%s", cell[rowNr,colNr], (colNr < maxCols ? OFS : ORS)
}
}
}
$ awk -f tst.awk file
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
উপরের সমাধানগুলি যে কোনও বেকায়দায় কাজ করবে (পুরানো, ভাঙা অ্যাজক অবশ্যই - সেখানে ওয়াইএমএমভি)।
উপরের সমাধানগুলি পুরো ফাইলটিকে মেমোরিতে পড়তে পারে - যদি ইনপুট ফাইলগুলি এর জন্য খুব বেশি হয় তবে আপনি এটি করতে পারেন:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ printf "%s%s", (FNR>1 ? OFS : ""), $ARGIND }
ENDFILE {
print ""
if (ARGIND < NF) {
ARGV[ARGC] = FILENAME
ARGC++
}
}
$ awk -f tst.awk file
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
যা প্রায় কোনও মেমরি ব্যবহার করে না তবে একটি লাইনে প্রতি ক্ষেত্রের সংখ্যায় একবার ইনপুট ফাইলটি পড়ে তাই এটি পুরো ফাইলটিকে মেমরিতে পড়ায় এমন সংস্করণটির চেয়ে অনেক ধীর হবে। এটি প্রতিটি লাইনে ক্ষেত্রের সংখ্যা একই বলে ধরে নিয়েছে এবং এটি জিএনইউ অ্যাডকে ব্যবহার করে ENDFILE
এবং ARGIND
তবে যে কোনও উত্তেজক পরীক্ষা FNR==1
এবং পরীক্ষা দিয়ে একই কাজ করতে পারে END
।