循环从 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 捕获为重定向到适当的文件。
我正在从这样的文件创建各种文本文件:
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 捕获为重定向到适当的文件。