3

我的计算机上有一个目录,其中包含我在网上找到的用于研究的整个数据库。这个数据库包含数千个文件,所以为了做我需要的事情,我一直在研究文件 i/o 的东西。一位程序员朋友建议使用 bash/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。第一列代表波长。我想稍后验证它们对于每个文件都是相同的,所以我将它们复制到一个文件中。第二列代表反射率,我希望这是一个单独的文件,因为稍后我将获取此信息并从中构建一个数据矩阵。第三列是反射率的标准偏差。

我现在遇到的问题是,当我运行此代码时,出现以下错误:没有这样的文件或目录

请,如果有人能告诉我为什么我可能会收到这个错误,或者可以指导我如何为我正在尝试做的事情编写代码......我将非常感激。

4

2 回答 2

3

主要问题是您需要引用输出文件名的名称,因为它们是字符串而不是变量。利用:

print $1 > "wavelengths.txt"

代替:

print $1 > wavelengths.txt
于 2013-11-23T17:50:10.530 回答
3

很好的尝试,但这是因为你永远不应该解析ls. 不过,您可能正在寻找ls -1,而不是ls -lawk也可以接受一团文件。例如,在所需目录中,您可以运行:

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"
}
于 2013-11-23T05:57:58.930 回答