0

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

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

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 服务器上执行此操作,如果它有所作为的话。

非常感谢!

4

1 回答 1

1
  1. Shell 不解析$i单引号 ( ') 引用的内容。所以引用的字符串应该在$i.
  2. FS应该在解析行之前设置。

以下代码将起作用。

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
于 2013-02-07T15:24:27.310 回答