tra-loi-cau-hoi-phat-trien-web.com

unix - đếm số cột trong tệp

Đư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

63
toop
awk -F'|' '{print NF; exit}' stores.dat 

Chỉ cần bỏ ngay sau dòng đầu tiên.

98
Mat

Đâ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
34
miku

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.

11
Tom van der Woerdt

Bạn có thể thử

mèo FILE | awk '{in NF}'

4
Cat Kerr

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
1
Don Question

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
1
Chris Koknat

Đâ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}'
1
user2533399

Đúng tinh khiết bash cách

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.

Thay thế: kiểm tra nhị phân mạnh cho các cột tối đa trên mỗi hàng

Đ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.

0
F. Hauri

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
0
Manu Mitra

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
0
sAguinaga

bạn có thể thử:

head -1 stores.dat | grep -o \|  | wc -l
0
user7231103