2013-11-23 5 views
3

У меня есть каталог на моем компьютере, который содержит всю базу данных, которую я нашел онлайн для своих исследований. Эта база данных содержит тысячи файлов, поэтому для того, чтобы делать то, что мне нужно, я искал материал файла ввода-вывода. Друг-программист предложил использовать bash/awk. Я написал мой код:Использование awk для обработки базы данных

#!/usr/bin/env awk 
    ls -l|awk' 
    BEGIN {print "Now running"} 
    {if(NR == 17/$1 >= 0.4/$1 <= 2.5) 
    {print $1 > wavelengths.txt; 
    print $2 > reflectance.txt; 
    print $3 > standardDev.txt;}}END{print "done"}' 

Когда я это в моей консоли, я уже в каталоге файлов, мне нужно получить доступ. Данные, которые мне нужны, начинаются в строке 17 КАЖДОГО файла. Данные выглядит следующим образом:

some number some number some number 
some number some number some number 
    .    .    . 
    .    .    . 
    .    .    . 

Я хочу получить доступ к данным, когда первый столбец имеет значение 0,4 (или приблизительно) и получить информацию до тех пор, первый столбец не имеет значение, равное приблизительно 2,5. Первый столбец представляет длины волн. Я хочу проверить, что они все равно для каждого файла позже, поэтому я копирую их в файл. Второй столбец отражает коэффициент отражения, и я хочу, чтобы это был отдельный файл, потому что позже я возьму эту информацию и построю из нее матрицу данных. Третья колонка - стандартное отклонение коэффициента отражения.

Проблема, которую я имею сейчас, что, когда я запускаю этот код, я получаю следующее сообщение об ошибке: Нет такого файла или каталога

Пожалуйста, если кто-нибудь может сказать мне, почему я мог бы получить эту ошибку, или может расскажите мне, как написать код для того, что я пытаюсь сделать ... Я буду так благодарен.

+0

Не смотря на свой код, вы наверняка хотите команду ls, а не 'Ls -l'. –

ответ

3

Отличная попытка, но это потому, что вы должны never parse the output of ls. Тем не менее, вы, вероятно, искали ls -1, а не ls -l. awk также может принимать глобус файлов. Например, в нужный каталог, вы можете запустить:

awk -f /path/to/script.awk * 

Содержание script.awk:

BEGIN { 
    print "Now running" 
} 

NR == 17 && $1 >= 0.4 && $1 <= 2.5 { 

    print $1 > "wavelengths.txt" 
    print $2 > "reflectance.txt" 
    print $3 > "standardDev.txt" 
} 

END { 
    print "Done" 
} 
3

Основная проблема заключается в том, что вам нужно процитировать имена имена выходных файлов, поскольку они являются строками а не переменные. Использование:

print $1 > "wavelengths.txt" 

вместо:

print $1 > wavelengths.txt 
Смежные вопросы