использование awk в скрипте bash с переменными для разбора - PullRequest
1 голос
/ 31 мая 2011

Я пытаюсь делать запросы из большого файла. Я использую "awk" в скрипте bash. Сценарий bash считывает некоторые параметры (строка за строкой) из файла параметров и помещает их в переменные, которые затем передаются в awk. Результат каждого запроса должен храниться в отдельном файле с именем, указанным в файле параметров:

#!/bin/bash

while IFS=\t read chr start end name
do 

echo $chr $start $end $name

awk -v "chr=$chr" -v "start=$start" -v "end=$end" '$1==chr && $3>start && $3<end && $11<5E-2 {print $0}' bigfile.out > ${name}.out

done < parameterfile

К сожалению, команда awk не выдает никаких результатов. Любая идея, что может быть не так. (на основе команды echo переменные bash назначены правильно).

Ответы [ 3 ]

1 голос
/ 01 июня 2011

Ключ в IFS:

while IFS='   ' read chr start end name

, где то, что находится между одинарными кавычками, является символом табуляции.

1 голос
/ 31 мая 2011

ИМХО Баш не понимает "\ т" в IFS. Попробуйте это

while IFS=$(echo -e "\t") read chr start end name
do
        echo =$chr=$start=$end=$name=
done <<EOF
11      1       10      aaa bbb
12      3       30      ccc bbb
EOF

Этот разделит текст с разделителями табуляции. Ваш вариант назначит все в $chr. Каждый раз печатать присвоения переменных с видимыми разделителями. :) '=' например.

0 голосов
/ 13 августа 2012

Я не знаю, какие именно конкретные требования предъявляются к bash, однако, если чтение входных данных из файла / пользователя является обязательным, то это должно работать

#!/bin/bash  
cat parameterfile |awk 'BEGIN{  
    FS="\t";  
}{  
 # If parameterfile has multiple lines, and you want to comment in them, prahaps  
 #  if($0~"^[ \t]*#")next;  
 # Will allow lines starting with # (with any amount of space or tab in the front) to be reconized  
 # as comments instead of parameters :-)  
 #  
 # read the parameter file, whatever format it may be.  
 # Here we assume parameterfile is tab separated, so inside the BEGIN{} we specify FS as tab  
 # if it is a cvs , then A[0]=split($0,A,","); and then chr=A[1]; as such.  
 chr=$1;  
 start=$2;  
 end=$3;  
 name=$4;  
 # Lets start reading the file. We could read this from parameter file, if you want, or a -v var=arg on awk  
 file_to_read_from="bigfile.out";  
 while((getline line_of_data < file_to_read_from)>0){  
    # Since I do not have psychic powers to guess the format of the input of the file, here is some example  
    # If it is separated my more than one space   
    # B[0]=split(line_of_data,B,"[ ]");  
    # If it is separated by tabs  
    B[0]=split(line_of_data,B,"\t");  

    # Check if the line matches our specified whatever  condition
    if( B[1]==chr && B[3]>start && B[3]<end && B[11]<5E-2 ){  
      # Print to whatever destination  
      print > name".out";  
    }  

 }  
 # Done reading all lines from file_to_read_from
 # Close opened file, so that we can handle millions of files  
 close(file_to_read_from);  
 # If parameterfile has multiple lines, then more is processed.
 # If you only want the first line of parameter file to be read, then
 # exit 0;
 # should get you out of here
}'   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...