【问题标题】:AWK for files in multiple foldersAWK 用于多个文件夹中的文件
【发布时间】:2014-06-03 03:59:30
【问题描述】:

我需要使用 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 脚本的输出仅列出每个 @987654324 中的每个 .frq 文件的 1-MAF 值(在本例中为 1-0.22,因此为 0.78)1000 次@ 目录。我在玩find,但它对我来说是新的,我不确定它是否是正确的工具。

【问题讨论】:

  • find /home/user/directory -name file.frq -exec awk <awk magic> {} \; 应该这样做。

标签: bash awk


【解决方案1】:
awk 'FNR == 2 {print FILENAME, 1 - $5}' data*/file.frq | sort -V

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

【讨论】:

  • +1 但将条件放在 awk 主体的条件部分中,而不是在操作部分中:awk '$5 ~ /^[0-9]*\.?[0-9]+$/{print FILENAME, 1 - $5}' data*/file.frq 测试数字的更好方法是 $5 == $5+0 所以 @987654324 @ 但在这种情况下,一个简单的 $5 ~ /[[:digit:]]/ 或只是 FNR==2 看起来就可以了。
  • 不幸的是,这种方法的输出并没有真正按数字排序,例如data1, data1000, data20(1000 在 20 之前)
  • 我可以建议awk 'FNR == 2 {print FILENAME, 1 - $5}' $(printf '%s\n' /home/user/directory/data*/file.frq | sort -n -k 1.26) 开始。
  • 管道输出到sort --version-sort 似乎也适用于我的测试
【解决方案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

【讨论】:

  • 这非常有用。这是我的下一个问题。数据文件夹按名称排序,因此输出按以下顺序排列:data1 data10 data100 data1000 data101 ... 我需要按 1-1000 排序的输出。这可能吗?
  • 您的问题似乎被截断了,您能用这些附加信息更新您的问题吗?
  • 由于一些过早的回报,我不得不编辑几次。它很快就会为您更新。
  • @jstewartmitchel 用可能的解决方案更新了答案
  • @yate 的解决方案运行速度会快一个数量级,FWIW。
【解决方案3】:

使用 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

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2020-08-02
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2019-06-18
    相关资源
    最近更新 更多