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ừ Nchar 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
trlà có bao nhiêu ký tự được thay thếc để bổ sung cho bộ ký tự đã cho-ltù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
-atùy chọn tự động phân chia dòng đầu vào trên khoảng trắng, được lưu trong @Fmảnggrep {$_ ne "N"} @Ftrả về mảng của tất cả các phần tử @Fkhông khớp với chuỗiN
grep {!/^N$/} @Fscalarsẽ 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 awkcá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
-1cho 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 ...
trvà tập lệnh shell POSIX :
tr -d 'N ' < file | while read x ; do echo ${#x} ; done
bash, kshVà 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 ...
awkvò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à awkcó thể không - khi awkchư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), awkcó thể chậm hơn .
awktrong 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 trvà 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à awkchỉ 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); }'