gpt4 book ai didi

linux - 将 awk 输出定向到变量

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:00 32 4
gpt4 key购买 nike

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

所以,我有一大堆文件需要使用相同的命令行程序处理,我正在尝试编写一个小的 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 协议(protocol)在远程 Linux 服务器上执行此操作,如果它有所作为的话。

非常感谢!

最佳答案

  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

关于linux - 将 awk 输出定向到变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14750604/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com