Tambahkan daftar nilai kolom A dan B dipisahkan oleh spasi dan tunjukkan hasil penjumlahan [duplikat]
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
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, $1
mewakili nilai kolom pertama , mewakili nilai $2
kolom kedua, untuk kolom $3
ketiga dan seterusnya dan satu NF
kolom khusus mewakili ID kolom terakhir dan karenanya $NF
merupakan nilai kolom terakhir (sehingga Anda dapat mengganti $2
di atas dengan $NF
too; dan ya Anda menangkapnya kapan NF
Id 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 awk
untuk mengeluarkan hasil numerik.
kolom (atau field) di awk
bedakan dengan FS
variabel ( F eild S eparator) yang defaultnya menggunakan Spasi / Tab. jika Anda ingin kolom dipisahkan pada karakter yang berbeda, Anda dapat mendefinisikannya kembali dengan -F
opsi awk
seperti 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 awk
kode 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 BEGIN
blok:
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 NF
di 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 awk
array untuk menangani kolom Id yang sama yang diambil dari nilai i
dan menambahkan nilainya $i
ke 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
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.