AWK और CSV फ़ाइलों को समझना

Oct 20 2020

मैं एक AWK प्रोग्राम कैसे लिख सकता हूं जो CSV फ़ाइलों में फ़ील्ड्स की सूची का विश्लेषण करता है, निर्दिष्ट फ़ील्ड में प्रत्येक भिन्न स्ट्रिंग की संख्या की गणना करें, और प्रत्येक स्ट्रिंग की गिनती का पता लगाएं जो कि मिली है? मैंने केवल सी और जावा में कोडित किया है, इसलिए मैं AWK के वाक्यविन्यास पर पूरी तरह से भ्रमित हूं। मैं अवधारणाओं को सबसे सरल समझता हूं, हालांकि, AWK को बहुत अलग तरीके से संरचित किया जाता है। किसी भी समय की सराहना की है, धन्यवाद!

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]
}

किसी CSV फ़ाइल में:

Field1, Field2, Field3, Field4
A, B, C, D
A, E, F, G
Z, E, C, D
Z, W, C, Q

मैं परिणाम प्राप्त करने में सक्षम हूं:

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

यह वांछित परिणाम है:

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

मेरे कोड में एक एडिट है जिस पर टिप्पणी की गई है।

जवाब

1 JamesBrown Oct 21 2020 at 03:35

अपना कोड निश्चित करें:

$ 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

आउटपुट (GNU awk का उपयोग करना। अन्य awks विभिन्न क्रम में प्रदर्शित आउटपुट):

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 वास्तव में इस नौकरी के लिए सही उपकरण नहीं है। जबकि AWK कोमा या टैब से अलग किए गए डेटा की व्याख्या कर सकते हैं, इसमें क्षेत्र के बाड़ों या पलायन की कोई अवधारणा नहीं है। तो यह एक सरल उदाहरण को संभाल सकता है जैसे:

Month,Day
January,Sunday
February,Monday

लेकिन इस वैध उदाहरण के साथ विफल होगा:

Month,Day
January,"Sunday"
February,"Monday"

उसके कारण, मैं किसी अन्य भाषा पर विचार करने की सलाह दूंगा। अजगर जैसा कुछ:

import csv
o = open('a.csv')
for m in csv.DictReader(o):
   print(m)

https://docs.python.org/library/csv.html

या रूबी:

require 'csv'
CSV.table('a.csv').each do |m|
   p m
end

https://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html

या यहां तक ​​कि 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