Если вы хотите запустить его из /bin/sh
скрипта:
#!/bin/sh
# the users to avoid
set -- user1 user2 user3 user4
# create a list of
# -o -user "username" -o -user "username" etc.
for user do
set -- "$@" -o -user "$user"
shift
done
shift # remove that first "-o"
# use the created array in the call to find
find. -maxdepth 1 -type d -name '*_pattern_*' ! '(' "$@" ')'
В качестве альтернативы, чтобы создать такой же ! -user "username"
список, который вы используете:
#!/bin/sh
# the users to avoid
set -- user1 user2 user3 user4
# create a list of
# ! -user "username" ! -user "username" etc.
for user do
set -- "$@" ! -user "$user"
shift
done
# use the created array in the call to find
find. -maxdepth 1 -type d -name '*_pattern_*' "$@"
(echo aacacgaactttaacacg ;echo aacacgaactttaacacg ) |
perl -ne '# Split input into triplets (A3)
# use each triplet as key in the hash table count
# and increase the value for the key
map { $count{$_}++ } unpack("(A3)*",$_);
# When we are at the end of the file
END{
# Remove the key "" (which is wrong)
delete $count{""};
# For each key: Print key, count
print map { "$_ $count{$_}\n" } keys %count
}'
Чуть более длинная -намотанная awk
версия
awk 'BEGINFILE{print FILENAME; delete codon}
ENDFILE {
if (NR!=1 || NF!=1 || length($0)%3!=0){
print "is broken"}
else{
for (i=1; i<=length($0); i+=3) codon[substr($0,i,3)]++};
for (c in codon) print c, codon[c];
print ""}' file*
Для этого входа
файл1 :ОК
aacacgaactttaacacg
файл2 :пробел
aacacgaact ttaacacg
файл3 :разрыв строки
aacacgaact
ttaacacg
файл4 :не кратно 3 основаниям
aacacgaactttaacac
Вы получаете
file1
aac 3
ttt 1
acg 2
file2
is broken
file3
is broken
file4
is broken
Если вы просто хотите восстановить файлы и у вас нет таких файлов, как file4
, тогда cat
ваши файлы через tr
с одного конца awk
или с другого, как в вашем примере
<<< $(cat file[1..3] | tr -d "\n ")
Вы получаете этот вывод, потому что первая строка вашего скрипта запускает новую bash
оболочку.
Эта строка должна читаться как
#!/bin/bash
(обратите внимание на #
в начале ).
Затем вы смешиваете синтаксис awk
с кодом оболочки таким образом, что это никогда не сработает.
Вместо этого не усложняйте задачу и разбейте файл на группы по три символа, отсортируйте их и подсчитайте, сколько уникальных символов вы получите:
$ fold -w 3 dnafile | sort | uniq -c
3 aac
2 acg
1 ttt
Это будет работать, если ввод всегда содержит кратное трем символам без пробелов или других символов.