Memahami file AWK dan CSV
Bagaimana cara menulis program AWK yang menganalisis daftar bidang dalam file CSV, menghitung jumlah setiap string berbeda di bidang yang ditentukan, dan mencetak jumlah setiap string yang ditemukan? Saya hanya membuat kode di C dan Java, jadi saya benar-benar bingung tentang sintaks AWK. Saya memahami konsep yang paling sederhana, namun AWK memiliki struktur yang sangat berbeda. Setiap saat dihargai, terima kasih!
BEGIN {
FS = ""
}
{
for(i = 1; i <= NF; i++)
freq[$i]++
PROCINFO ["sorted_in"] = "@val_num_desc" #this got the desired result
}
END {
for {this in freq)
printf "%s\t%d\n", this, freq[this]
}
Di file CSV yang berisi:
Field1, Field2, Field3, Field4
A, B, C, D
A, E, F, G
Z, E, C, D
Z, W, C, Q
Saya bisa mendapatkan hasilnya:
A 2
B 1
C 3
Q 1
D 1
E 2
F 1
, 12
G 1
W 1
Field1,Field2,Field3,Field4 1
Z 2
Ini adalah hasil yang diinginkan:
A 10
C 7
D 2
E 2
Z 2
B 1
Q 1
Field1 1
Field2 1
F 1
Field3 1
G 1
Field4 1
W 1
Ada edit pada kode saya yang dikomentari.
Jawaban
Memperbaiki kode Anda:
$ awk ' BEGIN { # you need BEGIN block for FS FS = ", *" # your data had ", " and "," seps } # ... based on your sample output { for(i = 1; i <= NF; i++) freq[$i]++
}
END {
for(this in freq) # fixed a parenthesis
printf "%s\t%d\n", this, freq[this]
}' file
Output (menggunakan GNU awk. Awks lain menampilkan output dalam urutan yang berbeda):
A 2
B 1
C 3
Q 1
D 2
Field1 1
E 2
Field2 1
F 1
Field3 1
G 1
Field4 1
W 1
Z 2
AWK bukanlah alat yang tepat untuk pekerjaan ini. Meskipun AWK dapat menafsirkan data yang dipisahkan Koma atau Tab, AWK tidak memiliki konsep enklosur bidang atau pelolosan. Sehingga bisa menangani contoh sederhana seperti:
Month,Day
January,Sunday
February,Monday
tetapi akan gagal dengan contoh yang valid ini:
Month,Day
January,"Sunday"
February,"Monday"
Karena itu, saya akan merekomendasikan untuk mempertimbangkan bahasa lain. Sesuatu seperti Python:
import csv
o = open('a.csv')
for m in csv.DictReader(o):
print(m)
https://docs.python.org/library/csv.html
Atau Ruby:
require 'csv'
CSV.table('a.csv').each do |m|
p m
end
https://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html
Atau bahkan PHP:
<?php
$r = fopen('a.csv', 'r'); $a_head = fgetcsv($r); while (true) { $a_row = fgetcsv($r); if (feof($r)) {
break;
}
$m_row = array_combine($a_head, $a_row); print_r($m_row);
}
https://php.net/function.fgetcsv