To jest plik części
N W N N N N N N N N N
N C N N N N N N N N N
N A N N N N N N N N N
N N N N N N N N N N N
N G N N N N N N N N N
N C N N N C N N N N N
N C C N N N N N N N N
W każdym wierszu chcę policzyć całkowitą liczbę wszystkich znaków, które nie są „N”
moje pragnienie wyjściowe
1
1
1
0
1
2
2
text-processing
bioinformatics
Anna1364
źródło
źródło
sed
do zastępowania rzeczy, na których ci nie zależy, iawk
do zliczenia pozostałej długoścised 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
Odpowiedzi:
Rozwiązanie GNU awk :
FPAT='[^N[:space:]]'
- wzorzec definiujący wartość pola (dowolny znak z wyjątkiemN
znaku i białych znaków)Oczekiwana wydajność:
źródło
źródło
awk '{print gsub(/[^ N]/,"")}'
zakładając, że liczba jest potrzebna dla każdej linii innej niż znak spacji i
N
tr
to ile znaków zostało zastąpionychc
w celu uzupełnienia zestawu podanych znaków-l
opcji, usuwa znak nowej linii z linii wprowadzania, aby uniknąć błędu off-by-one, a także dodaje znak nowej linii do instrukcji printBardziej ogólne rozwiązanie
-a
opcja automatycznego podziału linii wejściowej na białe spacje, zapisana w@F
tablicygrep {$_ ne "N"} @F
zwraca tablicę wszystkich elementów, w@F
których nie pasuje ciągN
grep {!/^N$/} @F
scalar
da da liczbę elementów tablicyźródło
Alternatywne rozwiązanie awk :
gsub(...)
-gsub()
Funkcja zwraca liczbę dokonanych podstawień.Wyjście:
źródło
Inne
awk
podejście (zwróci -1 dla pustych linii).Lub w postaci złożonej zwróci -1 w pustych wierszach, 0 tylko w wierszach z białymi spacjami (tabulatory / spacje).
źródło
-1
dla pustych linii ... ale wtedy może być pożądane rozróżnienie linii złożonej tylko z N / spacji vs pustej linii ...tr
i skrypt powłoki POSIX :bash
,ksh
izsh
:źródło
awk '{print length()}'
aby uniknąć wolniejszego zapętlania powłoki ... ale wtedy można to wszystko zrobić z samym awk ...awk
zapętlenie jest szybsze niż zapętlenie powłoki. Ale powłoka jest zawsze w pamięci iawk
może nie być - gdyawk
nie jest już załadowana lub zamieniona, narzut związany z jej ładowaniem ( stracony czas ) może być większy niż korzyść z działaniaawk
- szczególnie na małym pętla. W takich przypadkach ( tj. W tym przypadku)awk
może być wolniejszy .awk
w skrypcie powłoki może spowodować, że taki system będzie się czołgał na czworakach. Ogólnie: to samo opóźnienie opóźnień dotyczy systemów z ograniczonym oprogramowaniem układowym lub dowolnego systemu o dużym obciążeniu.Krótka kombinacja
tr
iawk
:To usuwa wszystkie spacje i Ns z pliku wejściowego i
awk
po prostu drukuje długość każdej linii.źródło
Innym łatwym sposobem jest zrobienie tego w Pythonie, który jest wstępnie zainstalowany w większości środowisk unixowych. Upuść następujący kod w pliku .py:
A następnie wykonaj:
Z twojego terminala. Powyższe powoduje:
źródło