Tambahkan daftar nilai kolom A dan B dipisahkan oleh spasi dan tunjukkan hasil penjumlahan [duplikat]

Dec 29 2020

Saya memiliki file bernama fold.txt. Ini memiliki dua nilai di setiap baris yang dipisahkan oleh spasi. Jika saya mengatakan bahwa nilai pertama mewakili kolom A dan nilai kedua setelah spasi adalah kolom B lalu bagaimana cara menambahkan semua nilai kolom A dan semua nilai kolom B dan menunjukkan penjumlahan setiap kolom secara individual?

Saya mengharapkan sesuatu seperti ini:

$ cat fold.txt
100 500
200 300
700 100

Keluaran:

Total count Column A = 1000
Total count column B = 900

Jawaban

5 αғsнιη Dec 29 2020 at 00:00

Dengan awk:

awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

dalam bahasa awk yang merupakan alat untuk keperluan pemrosesan teks, $1mewakili nilai kolom pertama , mewakili nilai $2kolom kedua, untuk kolom $3ketiga dan seterusnya dan satu NFkolom khusus mewakili ID kolom terakhir dan karenanya $NFmerupakan nilai kolom terakhir (sehingga Anda dapat mengganti $2di atas dengan $NFtoo; dan ya Anda menangkapnya kapan NFId kolom terakhir, jadi nilai variabel memberi tahu Anda berapa banyak kolom yang Anda miliki (pembaruan nilai untuk setiap baris awk dibaca dari input)).

Untuk menangani kasus tepi di mana file input kosong dan masih mendapatkan output numerik kita menambahkan 0 ke hasil memaksa awkuntuk mengeluarkan hasil numerik.

kolom (atau field) di awkbedakan dengan FSvariabel ( F eild S eparator) yang defaultnya menggunakan Spasi / Tab. jika Anda ingin kolom dipisahkan pada karakter yang berbeda, Anda dapat mendefinisikannya kembali dengan -Fopsi awkseperti di:

awk -F'<character-here>' '...' infile

atau di dalam BEGIN{...}blok seperti dengan FS:

awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile

misalnya untuk file input seperti di bawah ini (sekarang koma, bukan spasi):

100,500
200,300
700,100

Anda dapat menulis awkkode Anda sebagai berikut:

awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

Atau di dalam BEGINblok:

awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

Agak sedikit rumit dan untuk menjumlahkan semua N kolom dari file input Anda pada contoh berikut:

100,500,140,400
200,300,640,200
700,100,400,130

Jadi kita bicarakan NFdi paragraf pertama (nilai NF memberi tahu Anda berapa banyak kolom yang Anda miliki (perbarui per setiap baris)):

awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) { 
         printf ("Total count Column: %d= %d\n", colId, sum[colId] );
     };
}' infile

satu-satunya hal baru di sini adalah kita menggunakan awkarray untuk menangani kolom Id yang sama yang diambil dari nilai idan menambahkan nilainya $ike dalam array itu (indeks / kunci dari array ini adalah kolom Id); kemudian di END{...}blok kita mengulang array kita pada kunci itu terlihat kemudian mencetak kolom Id terlebih dahulu kemudian jumlah yang di sebelahnya, Anda akan melihat output seperti di bawah ini:

Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
ctac_ Dec 30 2020 at 01:56

Ini pekerjaan yang bagus untuk dc.

dc membaca dulu data dari fold.txt dan setelah kode dari sum_col_dc.

Gunakan seperti itu: dc fold.txt sum_col_dc

cat sum_col_dc  

[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx  

Dengan sedikit lebih banyak detail:

[lB+sBlA+sAz0<C]sC  
[lGLElDnnnp]sH  
[Total count Column ]sD  
[B]sE  
[A]SE  
[ = ]sG  
lCx  
lA  
lHx  
lB  
lHx  

Nikmati dc
Lebih jelaskan sesuai permintaan.