循环从 bash 中的值创建一个 DF

Loop to create a a DF from values in bash

我正在从这样的文件创建各种文本文件:

Chrom_x,Pos,Ref,Alt,RawScore,PHRED,ID,Chrom_y                                                                                                                                                
10,113934,A,C,0.18943,5.682,rs10904494,10                                                                                                                                                    
10,126070,C,T,0.030435000000000007,3.102,rs11591988,10                                                                                                                                       
10,135656,T,G,0.128584,4.732,rs10904561,10                                                                                                                                                   
10,135853,A,G,0.264891,6.755,rs7906287,10                                                                                                                                                    
10,148325,A,G,0.175257,5.4670000000000005,rs9419557,10                                                                                                                                       
10,151997,T,C,-0.21169,0.664,rs9286070,10                                                                                                                                                    
10,158202,C,T,-0.30357,0.35700000000000004,rs9419478,10                                                                                                                                      
10,158946,C,T,2.03221,19.99,rs11253562,10                                                                                                                                                    
10,159076,G,A,1.403107,15.73,rs4881551,10

我想做的是在 bash 中提取两个值之间的所有值:

gawk '>=0 && $NF<=5 {print [=12=]}' file.csv > 0_5.txt

并创建文件从 6 到 10,从 11 到 15...从 95 到 100。我正在考虑为此创建一个循环,例如

#!/usr/bin/env bash
n=( 0,5,6,10...)
if i in n:
 gawk '>=n && $NF<=n+1 {print [=13=]}' file.csv > n_n+1.txt

等等。

我如何将其转换为循环并创建具有该特定值的文件。

虽然您可以使用 shell 循环为 awk 脚本提供输入,但您也可以只使用 awk 将值本地拆分到桶中并将行写入这些“桶”文件本身:

awk -F, ' NR > 1 {
                i=int((( - 1) / 5))
                fname=(i*5) "_" (i+1)*5 ".txt"
                print [=10=] > fname
                  }' < input

代码跳过 header 行 (NR > 1),然后通过将第六列中的值除以五来计算“桶索引”。然后通过将该索引(及其增量)乘以 5 来构造文件名。然后将整行打印到该文件名。

要使用 shell 循环(并在输入上调用 awk 20 次),您可以使用如下内容:

for((i=0; i <= 19; i++))
do
  floor=$((i * 5))
  ceiling=$(( (i+1) * 5))
  awk -F, -v floor="$floor" -v ceiling="$ceiling" \
    'NR > 1 &&  >= floor &&  < ceiling { print }' < input \
  > "${floor}_${ceiling}.txt"
done

基本思路是一样的;在这里,我们使用外循环创建桶索引,然后将范围作为下限和上限变量传递给 awk。我们只要求 awk 打印匹配的行; awk 的输出被 shell 捕获为重定向到适当的文件。