bash awk保存输出到数组的内容

时间:2014-02-26 05:14:34

标签: arrays bash awk

如何保存在awk语句中打印的数据?能够访问变量或数组?每个文件有4个值(GATC)以及所有文件的总和。它迭代并打印每一行,如果找到符合条件的标准,并添加它找到的每一行的总数,总共四个。我需要稍后访问该信息。虽然找不到线条,但我不需要那样。我如何保存到数组中,我认为这是最好的方法呢?

for f in $FILES
do
      [ -d "$f" ] && continue

      if is_file_contains_DNA $f; then
          echo "DNA exist in " $f  >> $SUMMARYPATH
      #touch $OUTFILENAME$f
      awk '/^ATOM/&&substr($0,20,1)~/[GATC]/{print;l++;a[substr($0,20,1)]++}END{printf "total line : %s\n",l;for (i in a) printf "%s : %s \n",i,a[i]}' $f >> $RESULTSPATH$OUTFILENAME$f
      else
          echo "DNA DOES NOT exist in "$f >> $SUMMARYPATH
      fi

done

补充思想:

可能有一个更简单的解决方案。我可以使用“awk”而不是一个打印到两个文件吗?所以我想打印我现在的结果文件,然后添加到单个“SUMMARY”文件,就像我在awk之前为该行做的那样?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用awk内的文件描述符将一些内容输出到终端并捕获bash数组中的其他数据。例如

#! /bin/bash

exec 6>&1

files=(file1 file2)
res=()
numfiles=${#files[@]}

for (( i=0; i<$numfiles; i++)) ; do
    res[$i]=$(awk -f a.awk "${files[$i]}")
done

exec 6>&-

将打开一个带有数字6的新文件描述符,该描述符将在awk中提供,因此awk脚本a.awk可以是:

/^ATOM/ && substr($0,20,1)~/[GATC]/ {
    print > "/dev/fd/6"
    l++
    a[substr($0,20,1)]++
}
END {
    printf ("total line : %s\n",l) > "/dev/fd/6"
    printf "%s ", l
    for (i in a) {
        printf ("%s : %s \n",i,a[i]) > "/dev/fd/6"
        printf "%s ",a[i]
    }
}