如何在cut命令中循环变量范围

Fer*_*sta 5 bash cut environment-variables

我有一个包含2列的文件,我想使用第二列中的值来设置cut命令中的范围,以从另一个文件中选择一系列字符.我想要的范围是第二列中值的位置加上接下来的10个字符的字符.我将在一段时间内给出一个例子.

我的文件是这样的:

文件有2列,行之间没有空行(file1.txt):

NAME1 10
NAME2 25
NAME3 48
NAME4 66
Run Code Online (Sandbox Code Playgroud)

我想要提取可变字符范围的文件(只有一个很长的行,没有空格,没有粗体字)(file2.txt):

GATCGAGCGG GATTCTTTTT TTTTA GGCGAGTCAG CTAGCATCAGCTA CGAGAGGCGA GGGCGGGC TATCACGACT ACGACTACGACTACAGCATCAGCATCAGCGCACTAGAGCGAGGCTAGCTAGCTACGACTACGATCAGCATCGCACATCGACTACGATCAGCATCAGCTACGCATCGAAGAGAGAGC

...或者,更确切地说(用于复制/粘贴测试):

GATCGAGCGGGATTCTTTTTTTTTAGGCGAGTCAGCTAGCATCAGCTACGAGAGGCGAGGGCGGGCTATCACGACTACGACTACGACTACAGCATCAGCATCAGCGCACTAGAGCGAGGCTAGCTAGCTACGACTACGATCAGCATCGCACATCGACTACGATCAGCATCAGCTACGCATCGAAGAGAGAGC
Run Code Online (Sandbox Code Playgroud)

期望的结果文件,每行一个序列(result.txt):

GATTCTTTTT
GGCGAGTCAG
CGAGAGGCGA
TATCACGACT
Run Code Online (Sandbox Code Playgroud)

生成的文件将包含10-20,25-35,48-58和66-76中的字符,每个范围都在一个新行中.因此,它会始终保持10的范围内,但在不同的起点和那些启动点由值从第一个文件中的第二列设置.

我试过这个命令:

for i in $(awk '{print $2}' file1.txt);
do
        p1=$i;
        p2=`expr "$1" + 10`
        cut -c$p1-$2 file2.txt > result.txt;
done
Run Code Online (Sandbox Code Playgroud)

我没有收到任何输出或错误消息.

我也尝试过:

while read line; do
    set $line
    p2=`expr "$2" + 10`
    cut -c$2-$p2 file2.txt > result.txt;
done <file1.txt
Run Code Online (Sandbox Code Playgroud)

最后一个命令给出了一条错误消息:

cut: invalid range with no endpoint: -
Try 'cut --help' for more information.
expr: non-integer argument
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 4

这里不需要cutdd可以完成对文件进行索引的工作,并仅读取所需的字节数。(请注意,这status=none是一个 GNU 主义;如果您想抑制信息日志记录,您可能需要在其他平台上将其忽略并重定向 stderr)。

while read -r name index _; do
  dd if=file2.txt bs=1 skip="$index" count=10 status=none
  printf '\n'
done <file1.txt >result.txt
Run Code Online (Sandbox Code Playgroud)

这种方法避免了过多的内存需求(如读取整个数据时出现的那样file2——假设它很大),并且具有有限的性能要求(开销等于为dd每个序列启动一个副本来提取)。