Возможно, вы имеете в виду что-то подобное?
#!/bin/bash
for (( c=0; c<=200; c++ ))
do
output=$(php ./script.php "$1")
case $output in
*'foo'*) echo "Loop terminated"; break;;
esac
echo "$output"
done
Вдохновленный ответом @Archemar , вы также можете сказать
#!/bin/bash
for (( c=0; c<=200; c++ ))
do
! php ./script.php "$1" | grep -v 'foo' || break
done
< text tr -cs '[:alnum:]' '[\n*]' |
awk '++count[$0] == 10' |
sort
Замените $ 0
на tolower ($ 0)
, если вы хотите игнорировать регистр.
То, что tr соответствует s эквивалентам символов, которые являются c дополнением al pha num эрические к n ewlines. awk
печатает 10-е вхождение каждого.
Обратите внимание, что в системах GNU, tr
не работает должным образом с многобайтовыми символами . Однако в этих системах вы можете вместо этого использовать расширение GNU grep
-o
:
< text grep -Eo '[[:alnum:]]+' |
awk '++count[$0] == 10' |
sort
Вы можете изменить это значение на
< text grep -Eo '[^[:punct:][:space:]]+' |
awk '++count[$0] == 10' |
sort
, чтобы рассматривать символы, которые не являются ни punct uation или space (или tr -s '[: punct:] [: space:]' '[\ n *]'
выше для систем, отличных от GNU, или текст в формате ASCII), который в тексте «Война и мир» дает тот же результат.
Обратите внимание, что, по крайней мере, в системах GNU, это может по-прежнему давать неправильные результаты, поскольку, например, комбинированные акценты Unicode классифицируются как пунктуация , а не alnums (они не появляются в этом текст, где акцентированные символы находятся в их комбинированной форме).
В perl :
perl -e 'while(<>){while(/([[:alpha:]]+)/g){$c{$&}++}};foreach $w(keys %c){if($c{$w}<10){delete $c{$w}}};foreach $w(sort keys %c){print "$w\n"}' WarAndPeace.txt
С отступом :
perl -e '# Let s count every words
while(<>){
while(/([[:alpha:]]+)/g){
$c{$&}++
}
}
# Let s remove lesser than 10
foreach $w(keys %c){
if($c{$w}<10){
delete $c{$w}
}
}
# Let s sort and print
foreach $w(sort keys %c){
print "$w\n"
}' WarAndPeace.txt
С UTF-8 :
perl -e 'use open qw/:std :utf8/;
# Let s count every words
while(<>){
while(/([[:alpha:]]+)/g){
$c{$&}++
}
}
# Let s remove lesser than 10
foreach $w(keys %c){
if($c{$w}<10){
delete $c{$w}
}
}
# Let s sort and print
foreach $w(sort keys %c){
print "$w\n"
}' WarAndPeace.txt
Если вы уже удалили из файла точки и пробелы и в нем есть только слова, как указано в ваших комментариях (без лишних пробелов / табуляций), вы можете использовать sort
, uniq
и awk
, чтобы получить то, что вы хотели:
sort file_with_words | uniq -c | awk '{ if ($1 >= 10) { print}}'
Мое решение работает только в том случае, если файл правильно отформатирован (одно слово / строка, без лишних пробелов / табуляции).