在循环中命名awk输出

时间:2017-02-28 20:11:32

标签: bash shell loops awk

我对shell脚本的世界相对较新,所以希望这不会太难。我有一个文件(dirlist)与目录列表。我想

  1. cat'dirlist'以及每个文件的路径
  2. 使用名为samtools的程序从dirlist修改文件
  3. 使用awk对变量chr17上的samtools输出进行子集化
  4. 将输出写入使用目录第8个字段的文件,从'dirlist'命名
  5. 为dirlist
  6. 中列出的所有文件执行此操作

    我想我在这里有所有的作品。第1-3项工作正常,但循环只是命名文件“echo”。

    for i in `cat dirlist`; do samtools depth $i | awk '$1 == "chr17" {print $0}'  echo $i | awk -F'[/]' '{print $8}'; done
    

    非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

本机bash实现(只有一个进程,而不是为每个文件启动awk)如下:

while IFS= read -r filename; do
  while IFS= read -r line; do
    if [[ $line = "chr17"[[:space:]]* ]]; then
      IFS=/ read -r -a pieces <<<"$filename"
      printf '%s\n' "${pieces[7]}"
    fi
  done < <(samtools depth "$filename")
done <dirlist

答案 1 :(得分:1)

我认为这就是你想要做的事情

... | awk -v f="$i" 'BEGIN{split(f,fs,"/")} $1=="chr17" {print > fs[8]}'

最终文件名将从原始文件名生成,用“/”分隔,并仅使用第8段。有点不寻常,可能需要一些错误处理。

没有经过测试,请注意......