Запросить содержимое файла, используя другой файл в AWK - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь условно фильтровать файл на основе значений во втором файле.Файл1 содержит числа, а Файл2 содержит два столбца чисел.Вопрос в том, чтобы отфильтровать те строки в файле file1, которые попадают в диапазон, обозначенный в каждой строке файла file2.

У меня есть серия циклов, которая работает, но для ее выполнения требуется более 12 часов в зависимости от длины обоих файлов.,Этот код указан ниже.В качестве альтернативы я попытался использовать awk и просмотрел другие вопросы, опубликованные по поводу слабого переполнения, но я не могу понять, как соответствующим образом изменить код.

Метод петли:

while IFS= read READ
            do  
                position=$(echo $READ | awk '{print $4}')
                    while IFS= read BED
                        do
                            St=$(echo $BED | awk '{print $2}')
                            En=$(echo $BED | awk '{print $3}')
                        if (($position < "$St"))
                            then
                                break 
                        else 
                            if (($position >= "$St" && $position <= "$En"));
                                then 
                                    echo "$READ" | awk '{print $0"\t EXON"}' >> outputfile
                            fi  
                        fi
                        done < file2
            done < file1

Блоги с похожими вопросами:

awk: отфильтровать файл с другим файлом

awk 'NR==FNR{a[$1];next} !($2 in a)' d3_tmp FS="[ \t=]" m2p_tmp

Найти содержимое одного файла из другого файла в UNIX

awk -v FS="[ =]" 'NR==FNR{rows[$1]++;next}(substr($NF,1,length($NF)-1) in rows)' File1 File2

file1: (с разделителями табуляции)

AAA BBB 1500
CCC DDD 2500
EEE FFF 2000

file2: (с разделителями табуляции)

GGG 1250 1750
HHH 1950 2300
III 2600 2700

Ожидаемый вывод будет сохранять строки 1 и 3 из файла file1 (в новом файле, file3), поскольку эти записи попадают в диапазоны столбцов строки 2 и 3 строки 1, столбцов 2 строки 2 и столбцов 3 файла file2,В реальных файлах они не ограничены по строкам, то есть я не хочу смотреть на строку1 файла1 и сравнивать со строкой1 файла2, но сравнивать строку1 со всеми строками в файле2, чтобы получить совпадение.

file3 (вывод)

AAA BBB 1500
EEE FFF 2000

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

В одну сторону:

awk 'NR==FNR{a[i]=$2;b[i++]=$3;next}{for(j=0;j<i;j++){if ($3>=a[j] && $3<=b[j]){print;}}}' i=0 file2 file1
AAA BBB 1500
EEE FFF 2000

Считать содержимое file2 и сохранить его в массивах a и b.Когда прочитано file1, проверьте, находится ли число между целыми массивами a и b, и напечатайте.

Еще одна опция:

$ awk 'NR==FNR{for(i=$2;i<=$3;i++)a[i];next}($3 in a)'  file2 file1
AAA BBB 1500
EEE FFF 2000

File2 - эточитать, и весь диапазон чисел разбивается и сохраняется в ассоциированном массиве a.Когда мы читаем file1, нам просто нужно найти массив a.

0 голосов
/ 12 апреля 2019

Еще один awk.Это может иметь или не иметь смысла в зависимости от размеров файлов:

$ awk '
NR==FNR {
    a[$3]=$2                    # hash file2 records, $3 is key, $2 value
    next
}
{
    for(i in a)                 # for each record in file1 go thru ever element in a
        if($3<=i && $3>=a[i]) { # if it falls between
            print               # output
            break               # exit loop once match found
        }
}' file2 file1

Вывод:

AAA BBB 1500
EEE FFF 2000
...