Câu trả lời:
Giải pháp GNU awk :
awk -v FPAT='[^N[:space:]]' '{ print NF }' file
FPAT='[^N[:space:]]'
- mẫu xác định giá trị trường (bất kỳ ký tự nào ngoại trừ N
char và khoảng trắng)Sản lượng dự kiến:
1
1
1
0
1
2
2
awk '{ gsub("[ N]",""); print length() }'
awk '{print gsub(/[^ N]/,"")}'
giả sử rằng số lượng là cần thiết cho mỗi dòng khác với ký tự khoảng trắng và N
$ perl -lne 'print tr/N //c' ip.txt
1
1
1
0
1
2
2
tr
là có bao nhiêu ký tự được thay thếc
để bổ sung cho bộ ký tự đã cho-l
tùy chọn, loại bỏ ký tự dòng mới khỏi dòng đầu vào để tránh lỗi tắt và cũng thêm ký tự dòng mới cho câu lệnh in
Một giải pháp chung chung hơn
perl -lane 'print scalar grep {$_ ne "N"} @F' ip.txt
-a
tùy chọn tự động phân chia dòng đầu vào trên khoảng trắng, được lưu trong @F
mảnggrep {$_ ne "N"} @F
trả về mảng của tất cả các phần tử @F
không khớp với chuỗiN
grep {!/^N$/} @F
scalar
sẽ cho số phần tử của mảngGiải pháp thay thế awk :
awk '{ print gsub(/[^N[:space:]]/,"") }' file
gsub(...)
- gsub()
Hàm trả về số lần thay thế được thực hiện.Đầu ra:
1
1
1
0
1
2
2
Một awk
cách tiếp cận khác (sẽ trả về -1 cho các dòng trống).
awk -F'[^N ]' '$0=NF-1""' infile
Hoặc phức tạp, nó sẽ trả về -1 trên các dòng trống, 0 trên các dòng trắng (Tab / Spaces).
awk -F'[^N \t]+' '$0=NF-1""' infile
-1
cho các dòng trống ... nhưng sau đó có thể mong muốn phân biệt dòng được tạo thành chỉ bằng N / dấu cách và dòng trống ...
tr
và tập lệnh shell POSIX :
tr -d 'N ' < file | while read x ; do echo ${#x} ; done
bash
, ksh
Và zsh
:
while read x ; do x="${x//[ N]}" ; echo ${#x} ; done < file
awk '{print length()}'
để tránh vòng lặp vỏ chậm hơn .. nhưng sau đó người ta có thể làm tất cả với chính awk ...
awk
vòng lặp là nhanh hơn so với vỏ lặp. Nhưng lớp vỏ luôn nằm trong bộ nhớ và awk
có thể không - khi awk
chưa được tải hoặc bị tráo đổi, chi phí tải nó, ( mất thời gian ), có thể lớn hơn lợi thế của việc chạy awk
- đặc biệt là nhỏ vòng. Trong những trường hợp như vậy, ( ví dụ trường hợp này), awk
có thể chậm hơn .
awk
trong tập lệnh shell có thể làm cho hệ thống thu thập dữ liệu như vậy trên tất cả bốn bộ. Nói chung: lực kéo trễ tương tự áp dụng cho các hệ thống trong phần sụn bị giới hạn hoặc bất kỳ hệ thống nào chịu tải nặng.
Một sự kết hợp ngắn của tr
và awk
:
$ tr -d ' N' <file.in | awk '{ print length }'
1
1
1
0
1
2
2
Thao tác này sẽ xóa tất cả khoảng trắng Ns khỏi tệp đầu vào và awk
chỉ in độ dài của mỗi dòng.
Một cách dễ dàng khác là làm điều đó trong python, được cài đặt sẵn trong hầu hết các môi trường unix. Thả mã sau vào tệp .py:
with open('geno') as f:
for line in f:
count = 0
for word in line.split():
if word != 'N':
count += 1
print(count)
Và sau đó làm:
python file.py
Từ thiết bị đầu cuối của bạn. Những gì ở trên là:
sed
để thay thế những thứ bạn không quan tâm vàawk
để đếm chiều dài còn lạised 's/N//g ; s/\s//g' file | awk '{ print length($0); }'