मेरे पास अगले प्रारूप के साथ कई CSV फ़ाइलें हैं:

"name","last_name","birth_day","register_date"
Michael,Jackson,August 29 - 1958,August 29 - 1958
Claude,Shannon,April 30 - 1916,April 30 - 1916

मैं प्रत्येक फ़ाइल को अगले प्रारूप में बदलना चाहता हूं:

"name","last_name","birth_day","register_date",sha256
Michael,Jackson,August 29 - 1958,August 29 - 1958,9949a1af67a3fb465eca01ca884f5ec7cd280078a39a0430a0f352bf19e16685  -
Claude,Shannon,April 30 - 1916,April 30 - 1916,fb464b3ab4f3f3db2384e192135cde97486ce96fe34e391a3294e5076f800aae  -

इसका मतलब है कि मैं हैश मानों के साथ "sha256" कॉलम जोड़ना चाहता हूं।

अब तक मैं प्रत्येक पंक्ति के लिए हैश मान प्राप्त कर सकता था, लेकिन मुझे नहीं पता कि इस मान को CSV फ़ाइल में "sha256" कॉलम के रूप में कैसे जोड़ा जाए।

for file in ${DIR}/csv/*
do
    while IFS='' read -r line || [[ -n "$line" ]]; do
        echo -n $line | shasum -a 256
            /**
              Here it calculates the hash per row, and I want to add it
              at the end of the row as "sha256" column
            **/
    done < "$file"
done

मैं यह कैसे कर सकता हूं?

0
forkfork 20 जून 2017, 23:57

2 जवाब

ऐसा करने के लिए आप awk का उपयोग कर सकते हैं। GNU awk>= 4.1.0 के लिए कार्य:

awk -i inplace '
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
{
    if (FNR > 1){
        cmd = "echo -n \""$0"\" | shasum -a 256"
        while (cmd | getline line) {
            split(line, arr, "-")
            print $0","rtrim(arr[1])
        }
        close(cmd)
    }
    else {
        print $0",sha256"
    }
}' ${DIR}/csv/*
  • -i inplace का प्रयोग फाइलों को यथास्थान संपादित करने के लिए किया जाता है
  • FNR वर्तमान फ़ाइल में वर्तमान रिकॉर्ड संख्या है
  • शेल कमांड में वैरिएबल पास करने के लिए यह पोस्ट देखें
  • sha256 कमांड परिणाम को केवल sha256 मान रखने के लिए - सीमांकक के अनुसार विभाजित किया गया है। rtrim का उपयोग अतिरिक्त स्थान को हटाने के लिए किया जाता है
0
Bertrand Martel 21 जून 2017, 02:46
यह अद्भुत लग रहा है; हालांकि, यह फेंकता है: /usr/local/bin/awk: Argument list too long। यह लाइन ब्रेक की वजह से है?
 – 
forkfork
21 जून 2017, 20:20
awk --version का आउटपुट क्या है?
 – 
Bertrand Martel
21 जून 2017, 20:21
मैकोज़ पर awk संस्करण 20070501। उस फोल्डर के अंदर हजारों CSV फाइलें हैं।
 – 
forkfork
21 जून 2017, 20:22
आप gawk का उपयोग कर सकते हैं, इसे brew install gawk के साथ इंस्टॉल कर सकते हैं
 – 
Bertrand Martel
21 जून 2017, 21:29

आप लाइन के बाद हैश मान को सिर्फ प्रतिध्वनित क्यों नहीं करेंगे?

for file in ${DIR}/csv/*
do
    while IFS='' read -r line || [[ -n "$line" ]]; do
        hash=$(echo -n $line | shasum -a 256 | cut -d\  -f1)
        echo $line,$hash
    done < "$file"
done

cut पीछे वाले - को shasum आउटपुट से अलग कर देता है। यदि आप चाहें तो $hash के आसपास उद्धरण जोड़ें।

आपको प्रत्येक csv के लिए शीर्षलेख पंक्ति को छोड़ने पर विचार करना चाहिए।

0
Paul Coccoli 30 जुलाई 2017, 23:24