awk в операторе while

Из iptables -m owner --help :

owner match options:
[!] --uid-owner userid[-userid]      Match local UID

Вам необходимо указать UID, а не имя пользователя. Вместо этого попробуйте:

-A OUTPUT -i eth0 -p tcp --dport 2049 -m owner --uid-owner 0 -m state --state NEW,ESTABLISHED -j ACCEPT
2
29.01.2017, 00:52
5 ответов
declare -a list
readarray list < /path/to/species_list
for species in ${list[@]}; do
   sed -ne "/$species/,/^\$/p" moldata
done

Обычно можно заключить в одинарные кавычки встроенный скрипт sed , но мы используем переменную оболочки для поиска ваших данных и поэтому должны избегать $ , чтобы сохранить shell от попытки его разобрать.

0
27.01.2020, 22:10
$ awk '
    NR==FNR{ sp[$0]; next }        # this is for reading species data into sp array
    /species/ {                    # from this point for moldata's lines
        if (substr($0,2) in sp) {  # if the read line match with data in sp array
            print                  # first print title
            while(getline > 0) {   # and then read until blank line and print
                if (NF == 0) { print ""; break }
                print 
            } 
        }
    }
' species_list moldata 
>species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT

>species_3
CAAAGCCGTAGGCAAAGTCATTCCTGCTCTCAACGGTAAACTGACTGGCATGGCCTTCCGTGTTCCCGTTCCAAATGT
CGGTTGTGGATCTTACTGTTCGCyTGGGAAAACCAGCCTCTTATGACrCCATTAAACAGAAGGTCAAGGAGGCTGCTG

>species_5
GTTCCGCAAAGCTCAATGCCCTATTGTTGAGCGTCTGACCAATTCTCTCATGATGCATGGCCGCAACAACGGCAAGAA
TGATGGCAGTGCGAATTGTTAAGCATGCCTTTGAAATCATCCACCTTCTGACTGGAGAGAATCCTCTTCAAGTACTCG
0
27.01.2020, 22:10

Если вы настаиваете на использовании awk :

( echo -n '/^>('; paste -sd\| - <species_list | tr -d '\n'; echo -n ')/,/^$/' ) | \
    awk -f - moldata
1
27.01.2020, 22:10

«По специальному разрешению пустая строка в качестве значения RS указывает, что записи разделены одной или несколькими пустыми строками», поэтому

awk '    BEGIN { OFS=FS="\n"; RS=""; ORS="\n\n" }
         FNR==NR { for (k=0;k<NF;) ++species[">"$++k] }
         $1 in species
' species_list moldata
0
27.01.2020, 22:10

Для одной записи вы можете сделать что-то вроде этого:

awk '/species_1/{print;while (getline line){if(line !~/species/) print line; else break} }' input.txt                  
>species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT

Для нескольких элементов вы можете сделать что-то вроде этого:

$ while IFS= read -r line                                                                                                
> do
>   awk -v spec="$line" '$0~spec{print;while (getline line){if(line !~/species/) print line; else break} }' input.txt    
> done < species.txt                                                                                                     
>species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT

>species_3
CAAAGCCGTAGGCAAAGTCATTCCTGCTCTCAACGGTAAACTGACTGGCATGGCCTTCCGTGTTCCCGTTCCAAATGT
CGGTTGTGGATCTTACTGTTCGCyTGGGAAAACCAGCCTCTTATGACrCCATTAAACAGAAGGTCAAGGAGGCTGCTG

>species_5
GTTCCGCAAAGCTCAATGCCCTATTGTTGAGCGTCTGACCAATTCTCTCATGATGCATGGCCGCAACAACGGCAAGAA
TGATGGCAGTGCGAATTGTTAAGCATGCCTTTGAAATCATCCACCTTCTGACTGGAGAGAATCCTCTTCAAGTACTCG

Альтернативное решение с использованием двух файлов в качестве аргументов

Зная, что данные в примере OP всегда находятся через две строки после названия вида, мы можем загрузить названия видов в species.txt в массив, а затем использовать цикл for, чтобы прочитать строку дважды и вывести ее.

$ awk 'FNR==NR{species[$0]}; NR!=FNR{ sub(/>/,"");if ($0 in species){ print $0; for(i=0;i<=1;i++) {getline data;print data}  }}' species.txt input.txt
species_1
?????????CACTTGGArGGTGGAGCCAAGAAGGTTATTATTTCTGCTCCCAGTGCTGACGCGCCCATGTACGTGGTC
TGTCAACCTCGATTCTTATGACCCATCTGCTAAGGTCATTTCGAATGCTTCCTGCACCACCAACTGCCTCGCTCCCCT
species_3
CAAAGCCGTAGGCAAAGTCATTCCTGCTCTCAACGGTAAACTGACTGGCATGGCCTTCCGTGTTCCCGTTCCAAATGT
CGGTTGTGGATCTTACTGTTCGCyTGGGAAAACCAGCCTCTTATGACrCCATTAAACAGAAGGTCAAGGAGGCTGCTG
species_5
GTTCCGCAAAGCTCAATGCCCTATTGTTGAGCGTCTGACCAATTCTCTCATGATGCATGGCCGCAACAACGGCAAGAA
TGATGGCAGTGCGAATTGTTAAGCATGCCTTTGAAATCATCCACCTTCTGACTGGAGAGAATCCTCTTCAAGTACTCG
1
27.01.2020, 22:10

Теги

Похожие вопросы