AWK用于多个文件夹中的文件

时间:2014-06-02 17:52:29

标签: bash awk

我需要使用AWK对1000个文件夹进行排序,并在文件中提取第5列的第2行。我们称之为file.frq。例如:

home/user/directory/data1/file.frq
...
home/user/directory/data1000/file.frq

file.frq看起来像这样:

 CHR  SNP   A1   A2          MAF  NCHROBS
   3  fa0    A    G         0.22      300

我需要AWK脚本的输出只列出每个。frq文件中的1-MAF值(在这种情况下为 1-0.22,因此为0.78 )1000次data目录。我正在玩find,但这对我来说是新的,我不确定它是不是正确的工具。

3 个答案:

答案 0 :(得分:3)

awk 'FNR == 2 {print FILENAME, 1 - $5}' data*/file.frq | sort -V

如果是第二条记录,则打印文件名和1 - 第五列。版本排序似乎得到了正确的排序。

答案 1 :(得分:2)

仅获取值:

find /home/user/directory/ -name file.frq -exec awk 'FNR == 2 { print 1-$5 }' {} \;

还要在输出中获取文件名:

find /home/user/directory/ -name file.frq -exec awk 'FNR == 2 { print FILENAME " " 1-$5 }' {} \;

修改

要按所需顺序对输出进行排序,您可以通过以下方式管道输出结果:

sed s/data// | sort -n | sed s/^/data/

或更短:

sort -ta -k3n

答案 2 :(得分:0)

使用Ruby:

ruby -e 'def get_i(f); f.gsub(/^.*\/data/, "").gsub(/\/file.frq$/, "").to_i; end;
    Dir.glob("/home/user/directory/data*/file.frq").sort{|a,b| get_i(a) <=> get_i(b)}.each{|f|
        File.readlines(f).each{|l| v = (Float(l.split[4]) rescue nil) and puts "#{f} #{(1-v).to_s}"}}'

我在测试版上输出了这个输出:

/tmp/data1/file.frq 0.78
/tmp/data20/file.frq 0.78
/tmp/data1000/file.frq 0.78