Saya memiliki file besar dalam format berikut:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Jika nilai-nilai di kolom 2 cocok, saya ingin menjumlahkan nilai-nilai di kolom 3 dan 4 dari kedua baris, kalau tidak hanya jumlah nilai-nilai di baris unik.
Jadi output yang saya harapkan akan terlihat seperti ini:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Saya dapat mengurutkan file menurut kolom 2 dengan awk
atau sort
dan menjumlahkan kolom terakhir dengan awk
, tetapi hanya untuk setiap baris bukan untuk dua baris di mana kolom 2 cocok.
text-processing
awk
sort
uniq
TomPio
sumber
sumber
$1 $2
sebagai kuncinya.Jawaban:
Saya akan melakukan ini di Perl:
Atau awk:
Jika Anda ingin output diurutkan sesuai dengan kolom kedua, Anda bisa mengirimkannya ke
sort
:Perhatikan bahwa kedua solusi termasuk kolom 1 juga. Idenya adalah menggunakan kolom pertama dan kedua sebagai kunci hash (dalam perl) atau array asosiatif (dalam awk). Kunci dari setiap solusi adalah
column1 column2
jika dua baris memiliki kolom yang sama dua tetapi kolom yang berbeda, mereka akan dikelompokkan secara terpisah:sumber
Mungkin ini bisa membantu, tetapi apakah kolom 1 selalu 2 dan apakah hasilnya bergantung padanya?
atau seperti yang disebutkan oleh glenn jackman dalam komentar tentang penyortiran:
sumber
PROCINFO["sorted_in"] = "@ind_num_asc"
sebagai ganti perpipaansort
. ref gnu.org/software/gawk/manual/html_node/…Anda dapat melakukan pra-sortir data dan membiarkan awk menangani detail:
Anda mungkin ingin mengatur ulang akumulator:
Keluaran:
Jika Anda benar-benar ingin menyimpan kolom pertama, lakukan sesuatu seperti ini:
Keluaran:
Penjelasan
The
p
variabel memegang$2
nilai dari baris sebelumnya, atau$1FS$2
dalam kasus kedua di atas. Ini berarti bahwa{print p,s}
dipicu ketika$2
dari baris sebelumnya tidak sama dengan yang ada di baris saat ini (p!=$2
).sumber
sort -k2
untuk mengurutkan berdasarkan kolom keduaMenggunakan pisau swiss tentara util
mlr
:Keluaran:
Catatan:
--nidx
memberitahumlr
untuk menggunakan nama bidang numerik.put '$5=$3+$4'
membuat bidang 5 baru , jumlah bidang 3 dan 4 .The
stats1
fungsi (atau " kata kerja ") adalah lebih kecil swiss army knifedalam lebih besar swiss pisau tentara
mlr
, dengan beberapa fungsi berdasarkan akumulator sepertisum
,count
,mean
, dllstats1 -g 1,2
mengelompokkan data berdasarkan kolom 1 dan 2 , dan-f 5 -a sum
kemudian menambahkan bidang kelompok-kelompok tersebut 5 .stats1
hanya mencetak bidang bernama.sumber