将awk输出定向到变量

时间:2013-02-07 12:00:03

标签: linux

这里的新人有一个问题,希望有一个简单的解决方案,但我似乎无法管理。

因此,我需要使用相同的命令行程序处理大量文件,我正在尝试编写一个小的shell脚本来自动执行此操作。我写了一些东西,它将从文本文件中读取输入文件名,并为每个文件重复命令。到现在为止还挺好。我的问题是命名输出。每个文件以通用格式“lane_number_bla_bla_bla”命名,并且它们成对处理。因此,将需要组合成单个输出文件的“lane_1_bla_bla_bla_001”和“lane_1_bla_bla_bla_002”。为此,我尝试使用awk从.txt输入文件列表中读取样本编号,并将其解析为输出文件编号。这是我提出的代码(请注意,命令之前的echo语句仅用于测试;它在运行实际程序时被删除;这也不是实际的命令,它更复杂,但原理仍然适用):

echo "Which input1 should I use?"
read text
input1=$text
echo "Which input2 should I use?"
read text
input2=$text
echo "How many lines?"
read text
n=$text
for i in $(seq 1 $n)
do
  awkinput1=$(awk NR==$i $input1)
  awkinput2=$(awk NR==$i $input2)
  num=$(awk 'NR==$i{print $2 }' FS="_" $input1)
  lane=$(awk 'NR==$i{print $1 }' FS="_" $input1)
  echo "command $awkinput1.in > $awkinput1.out && command $awkinput2.in > $awkinput2.out && command cat $awkinput1.out $awkinput2.in > $num-$lane-CAT.out &"
  if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done

当我运行它时,两个$ awkinput字段在命令行中被适当的文件名正确替换,而不是$ num和$ lane字段,它们什么都不打印。

那么,我做错了什么?我确信这很简单,但我尝试了很多不同的方法来格式化相关的awk命令,似乎没有任何工作。我正在使用SSH协议在远程Linux服务器上执行此操作,如果它有所作为。

非常感谢!

1 个答案:

答案 0 :(得分:1)

  1. Shell不解析单引号($i)引用的'。所以引用的字符串应该在$i之前终止。
  2. 解析行之前应设置
  3. FS
  4. 以下代码可以使用。

    num=$(awk 'BEGIN{FS="_"} NR=='$i'{print $2 }' $input1)
    lane=$(awk 'BEGIN{FS="_"} NR=='$i'{print $1 }' $input1)
    

    以下代码效率更高:

    while read in1 ; do
      read in2 <&3
      num=$(awk 'BEGIN{FS="_"} {print $2 }' <<<"$in1")
      lane=$(awk 'BEGIN{FS="_"} {print $1 }' <<<"$in1")
      ...
    done <$input1 3<$input2