Đưa ra một tệp có dữ liệu như thế này (tức là tệp store.dat)
sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200
Điều gì sẽ là một lệnh để xuất số lượng tên cột?
tức là trong ví dụ trên sẽ là 4. (số ký tự ống + 1 trong dòng đầu tiên)
Tôi đã suy nghĩ một cái gì đó như:
awk '{ FS = "|" } ; { print NF}' stores.dat
nhưng nó trả về tất cả các dòng thay vì chỉ đầu tiên và cho dòng đầu tiên, nó trả về 1 thay vì 4
awk -F'|' '{print NF; exit}' stores.dat
Chỉ cần bỏ ngay sau dòng đầu tiên.
Đây là một cách giải quyết (đối với tôi: Tôi không sử dụng awk rất thường xuyên):
Hiển thị hàng đầu tiên của tệp chứa dữ liệu, thay thế tất cả các ống bằng dòng mới và sau đó đếm các dòng:
$ head -1 stores.dat | tr '|' '\n' | wc -l
Trừ khi bạn đang sử dụng khoảng trắng trong đó, bạn sẽ có thể sử dụng | wc -w
trên dòng đầu tiên.
wc
là "Đếm từ", chỉ đơn giản là đếm các từ trong tệp đầu vào. Nếu bạn chỉ gửi một dòng, nó sẽ cho bạn biết số lượng cột.
Bạn có thể thử
mèo FILE | awk '{in NF}'
Nếu bạn đã cài đặt python, bạn có thể thử:
python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
stores.dat
Giải pháp Perl tương tự như giải pháp awk của Mat:
Perl -F'\|' -lane 'print $#F+1; exit' stores.dat
Tôi đã thử nghiệm điều này trên một tệp có 1000000 cột.
Nếu dấu tách trường là khoảng trắng (một hoặc nhiều khoảng trắng hoặc tab) thay vì đường ống:
Perl -lane 'print $#F+1; exit' stores.dat
Đây thường là những gì tôi sử dụng để đếm số lượng các trường:
head -n 1 file.name | awk -F'|' '{print NF; exit}'
Trong bash, bạn có thể chỉ cần:
IFS=\| read -ra headline <stores.dat
echo ${#headline[@]}
4
Nhanh hơn rất nhiều vì không có dĩa và có thể sử dụng lại dưới dạng $headline
giữ dòng đầu đầy đủ. Bạn có thể, cho mẫu:
printf " - %s\n" "${headline[@]}"
- sid
- storeNo
- latitude
- longitude
Nota Cú pháp này sẽ điều khiển chính xác khoảng trắng và các ký tự khác trong tên cột.
Điều gì nếu một số hàng có chứa một số cột thêm?
Lệnh này sẽ tìm kiếm dòng lớn hơn, đếm dấu phân cách :
tr -dc $'\n|' <stores.dat |wc -L
3
Có tối đa 3 dấu phân cách, sau đó là 4 trường.
Dựa trên phản ứng của Cat Kerr. Lệnh này đang làm việc trên solaris
awk '{print NF; exit}' stores.dat
chọn bất kỳ hàng nào trong tệp (trong ví dụ bên dưới, đó là hàng thứ 2) và đếm số cột, trong đó dấu phân cách là khoảng trắng:
sed -n 2p text_file.dat | tr ' ' '\n' | wc -l
bạn có thể thử:
head -1 stores.dat | grep -o \| | wc -l