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)
这里不需要cut;dd可以完成对文件进行索引的工作,并仅读取所需的字节数。(请注意,这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每个序列启动一个副本来提取)。
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |