AWK ve CSV dosyalarını anlama

Oct 20 2020

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

1 JamesBrown Oct 21 2020 at 03:35

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
StevenPenny Oct 21 2020 at 03:10

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