AWK ve CSV dosyalarını anlama
CSV dosyalarındaki alanların listesini analiz eden, belirtilen alandaki her farklı dizenin sayısını sayan ve bulunan her dizenin sayısını yazdıran bir AWK programını nasıl yazabilirim? Sadece C ve Java ile kodladım, bu yüzden AWK sözdizimi konusunda kafam tamamen karıştı. En basit kavramları anlıyorum, ancak AWK çok farklı şekilde yapılandırılmış. Her zaman takdir edilir, teşekkür ederim!
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]
}
Şunları içeren bir CSV dosyasında:
Field1, Field2, Field3, Field4
A, B, C, D
A, E, F, G
Z, E, C, D
Z, W, C, Q
Sonucu elde edebiliyorum:
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
İstenilen sonuç budur:
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
Kodumda yorumlanmış bir düzenleme var.
Yanıtlar
Kodunuz düzeltildi:
$ 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
Çıktı (GNU awk kullanılarak. Diğer awk'ler çıktıları farklı sırada görüntüler):
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 gerçekten bu iş için doğru araç değil. AWK, Virgül veya Sekmeyle ayrılmış verileri yorumlayabilse de, alan muhafazası veya kaçış kavramı yoktur. Dolayısıyla, aşağıdaki gibi basit bir örneği ele alabilir:
Month,Day
January,Sunday
February,Monday
ancak bu geçerli örnekle başarısız olur:
Month,Day
January,"Sunday"
February,"Monday"
Bu nedenle, başka bir dil düşünmenizi tavsiye ederim. Python gibi bir şey:
import csv
o = open('a.csv')
for m in csv.DictReader(o):
print(m)
https://docs.python.org/library/csv.html
Veya Ruby:
require 'csv'
CSV.table('a.csv').each do |m|
p m
end
https://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html
Hatta 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