nume de căutare Incapabil care conțin trei 7s în ordine aleatorie de AWK / Python / Bash

voturi
0

Trebuie să găsesc nume care conțin trei numărul 7, în ordine aleatorie.

Încercarea mea

Trebuie să găsim primele nume care nu conțin șapte

ls | grep [^7]

Apoi, am putea elimina aceste meciuri din întreg spațiul

ls [remove] ls | grep [^7]

Problema mea în pseudo-cod începe să se repete rapid.

Cum puteți găsi numele care conțin trei 7s în ordine aleatorie de către AWK / Python / Bash?

[edit] Numele poate conține orice număr de litere și conține cuvinte de trei 7s.

Întrebat 12/03/2009 la 14:11
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
7

Nu înțeleg partea despre „ordine aleatorie“. Cum face diferența între „ordine“, atunci când este aceeași ordine de idei care se repetă? Este „a7b7“ diferit de „c7d7“ în ordinea 7s?

Oricum, acest lucru ar trebui să lucreze:

 ls *7*7*7*

Doar lasă să coajă rezolva problema, dar poate că nu am înțeles corect.

EDIT: Cele de mai sus este greșit, acesta include cazuri cu mai mult de patru 7s care nu este dorit. Presupunând că acest lucru este bash, iar expandarea extins este activat, aceasta funcționează:

ls *([^7])7*([^7])7*([^7])7*([^7])

Aceasta prevede ca „zero sau mai multe caractere care nu sunt șeptari, urmate de un șapte, urmat de zero sau mai multe caractere care nu sunt șeptari“, și așa mai departe. Este important să se înțeleagă că asteriscul este un prefix operator de aici, care operează pe expresia , ([^7])ceea ce înseamnă „orice caracter cu excepția 7“.

Publicat 12/03/2009 la 14:15
sursa de către utilizator

voturi
5

Cred că doriți să găsiți fișiere care conțin exact trei 7, dar , nu mai mult. Utilizarea grep gnu cu comutator se extinde regexp ( -E):


ls | grep -E '^([^7]*7){3}[^7]*$'

Ar trebui să rezolve problema.

Practic, care se potrivește cu 3 apariții ale „nu 7 urmate de 7“, apoi o grămadă de „nu 7“ pe întregul șir (^ și $ la începutul și sfârșitul modelului respectiv).

Publicat 12/03/2009 la 14:35
sursa de către utilizator

voturi
2

Ceva de genul:

printf '%s\n' *|awk -F7 NF==4
Publicat 12/03/2009 la 15:31
sursa de către utilizator

voturi
1

Sau în loc de a face aceasta într-un singur grep, utilizați un grep pentru a găsi fișiere cu-3 sau mai multe 7S și altul pentru a filtra 4-sau mai multe-7s.

ls -f | egrep '7.*7.*7' | grep -v '7.*7.*7.*7'

Ai putea muta o parte din munca în coajă cu glob mai scurt

ls -f *7*7*7* | grep -v '7.*7.*7.*7'

deși în cazul în care există un număr mare de fișiere care se potrivesc cu acel model, atunci acesta din urmă nu va funcționa din cauza limitelor încorporate la dimensiunea glob.

„-f“ în „ls“ este de a preveni „ls“ din sortarea rezultatelor. În cazul în care există un număr foarte mare de fișiere în directorul atunci timpul de sortare poate fi destul de vizibile.

Acest proces de filtrare în două etape este, cred, mai ușor de înțeles decât folosind [^ 7] modele.

De asemenea, aici e soluția ca un script Python, din moment ce a cerut ca ca o opțiune.

import os
for filename in os.listdir("."):
    if filename.count("7") == 4:
        print filename

Acest lucru se va ocupa de câteva cazuri care comenzile shell nu vor, cum ar fi (rele) care conțin nume de fișiere un caracter NEWLINE. Deși chiar și aici, de ieșire, în acest caz, ar fi probabil în continuare greșit, sau cel puțin nepregătit pentru programele de aval.

Publicat 12/03/2009 la 15:39
sursa de către utilizator

voturi
2

O soluție Perl:

$ ls | perl -ne 'print if (tr/7/7/ == 3)'
3777
4777
5777
6777
7077
7177
7277
7377
7477
7577
7677
...

(I se întâmplă să aibă un director cu numere de 4 cifre. 1777 și 2777 nu există. :-)

Publicat 12/03/2009 la 15:53
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more