मैं निर्देशिका में प्रत्येक .xls की फ़ाइलों और पंक्तियों की संख्या गिनने की कोशिश कर रहा हूं जहां मैंने स्क्रिप्ट निष्पादित की है।

total_files=0
total_lines=0

find . -type f -name "*.xls" | while read FILE; do

 count=$(grep -c ^ < "$FILE") #get number of lines in particular file
 total_lines=$(($total_lines+$count));
 ((total_files++))

done

echo "Total files: $total_files"
echo "Total lines: $total_lines"

लेकिन मुझे हर बार योग में सिर्फ 0 मिलता है।

मुझे पता है कि यह संभवतः एक उप खोल में लूप निष्पादित होने के कारण है, लेकिन वर्तमान शेल में निष्पादित करने के लिए <<< का उपयोग करने से मदद नहीं मिलेगी:

done <<< "$(find . -type f -name "*.xls")"
1
干猕猴桃 12 जुलाई 2021, 14:46

3 जवाब

सबसे बढ़िया उत्तर

ठीक काम करता है:

#!/usr/bin/env bash

total_files=0
total_lines=0

while IFS= read -r file; do
  count="$(wc -l < "$file")"
  (( total_lines+=count ))
  (( total_files++ ))
  echo "$count"
done <<< "$(find . -type f -name '*.xls')"
0
Ed Morton 12 जुलाई 2021, 13:10

awk इस कार्य के लिए एक बेहतर उपकरण है क्योंकि यह दोनों गणनाओं को एक बार में मूल रूप से कर सकता है:

find . -type f -iname '*.xls' -exec awk \
 'END{printf("Number of files: %d\nTotal number of lines: %d\n", ARGC, NR)}' {} \+
0
Léa Gris 12 जुलाई 2021, 12:57

यूनिक्स लाइन काउंट मेथड्स टेक्स्ट फाइलों पर सख्ती से काम करते हैं, जिनमें (ज्यादातर) सीएसवी फाइलें शामिल हैं।

Excel फ़ाइलें टेक्स्ट नहीं हैं। Excel फ़ाइलें या तो हैं .xls 2007 तक उपयोग की गई बाइनरी फ़ाइल टाइप करें या .xlsx तब से उपयोग की गई खुली xml शैली फ़ाइल। न तो रेखा उन्मुख हैं।

ऐसा करने का एकमात्र विश्वसनीय तरीका एक स्क्रिप्टिंग भाषा का उपयोग करना है जो एक्सेल फाइलों को पार्स कर सकता है और फाइल ट्री चल सकता है।

पायथन, रूबी, Perl यह सब यूनिक्स पर कर सकते हैं।

यहाँ पंडों के साथ एक फ़ाइल ट्री चलने, फ़ाइल पढ़ने और उस फ़ाइल की डिफ़ॉल्ट शीट की पंक्तियों को गिनने के लिए एक पायथन है:

# Note: You may need to use pip to install
#       pandas
#       xldd
#       openpyxl

import pandas as pd
from pathlib import Path 

p=Path('ur_root_path')

file_count=0
line_count=0
for pn in p.glob('**/*.xls*'):
    try:
        df=pd.read_excel(pn,header=None)
        print(f'{pn}\n{df}')
        file_count+=1
        line_count+=df.shape[0]
    except ValueError as e:
        print(f'{pn}: {e}')
    
print(f'files={file_count}, total lines={line_count}')  

इस फ़ोल्डर को देखते हुए:

$ ls -1 /tmp/test
Book1.xlsx          # 3 rows in col 'A' -- 1-3
Book2.xls           # 6 rows in col 'C' -- 1-6

उस स्क्रिप्ट को चलाने से उत्पादन होता है:

/tmp/test/Book2.xls
    0   1  2
0 NaN NaN  1
1 NaN NaN  2
2 NaN NaN  3
3 NaN NaN  4
4 NaN NaN  5
5 NaN NaN  6
/tmp/test/Book1.xlsx
   0
0  1
1  2
2  3
files=2, total lines=9
1
dawg 12 जुलाई 2021, 14:22