Memahami file AWK dan CSV

Oct 20 2020

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

1 JamesBrown Oct 21 2020 at 03:35

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

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