Awk 如何打印值满足范围的列?
我有一张有数千列和数千行的大桌子。但是为了简化,假设我有一个由11行和100列组成的表。表格单元格包含介于0和1之间的值。该表如下所示:Awk 如何打印值满足范围的列?,awk,multiple-columns,extraction,Awk,Multiple Columns,Extraction,我有一张有数千列和数千行的大桌子。但是为了简化,假设我有一个由11行和100列组成的表。表格单元格包含介于0和1之间的值。该表如下所示: Sample1 Sample2 Sample3 Sample4 1 0 0.001 0.002 0.74 0.52 0.654 0.75 0.65 0.64 0.455 0.72 0.24 0.51 0.512 0.78 0.25 0.555 0.557 0
Sample1 Sample2 Sample3 Sample4
1 0 0.001 0.002
0.74 0.52 0.654 0.75
0.65 0.64 0.455 0.72
0.24 0.51 0.512 0.78
0.25 0.555 0.557 0.25
0.003 0.454 0.532 0.23
0.02 0.56 0.643 0.22
1 0.495 0.555 0.99
0.992 1 0.999 0.98
0.12 0 0.968 1
现在,我想扫描所有单元格,查找特定范围0.80>=value>=0.70内的所有值。任何包含值的单元格,都将打印整个列,包括标题。
预期输出如下:
Sample1 Sample4
1 0.002
0.74 0.75
0.65 0.72
0.24 0.78
0.25 0.25
0.003 0.23
0.02 0.22
1 0.99
0.992 0.98
0.12 1
使用awk的命令更可取,但我不知道它是否最适合这种提取
请告诉我怎么做。任何帮助都将不胜感激。谢谢。
awk
营救
$ awk 'NR==FNR && NR>1{for(i=1; i<=NF; i++)
if(0.7<=$i && $i<=0.8) col[i]=1; next}
{for(i=1 ;i<=NF; i++)
if(col[i]) printf "%s", $i OFS; print ""}' file{,} | column -t
Sample1 Sample4
1 0.002
0.74 0.75
0.65 0.72
0.24 0.78
0.25 0.25
0.003 0.23
0.02 0.22
1 0.99
0.992 0.98
0.12 1
$awk'NR==FNR&&NR>1{for(i=1;i不确定这是否适用于您正在处理的表的大小,但任何解决方案都可能必须在数组中存储某些内容,或者是多通道
我的第一个想法是给定rotate.awk
如下:
{
for (i=1; i<=NF; i++) {
d[i,NR]=$i
}
}
END {
for (i=1; i<=NF; i++) {
tab=""
for (j=1; j<=NR; j++) {
printf "%s%s", tab, d[i,j]
tab="\t"
}
printf "\n"
}
}
{
对于(i=1;i$cat tst.awk
开始{FS=OFS=“\t”}
NR==FNR{
如果(FNR>1){
对于(i=1;i=0.7)&($i可能会将文件传递两次。)第一次传递时,根据给定条件为每列生成一个具有真/假值的数组。下一次传递时,打印所需的列…您必须自己尝试一些操作并添加到问题中。请参阅有关两个文件处理的示例您的输出是任意的:它不符合条件“0.80>=值>=0.70"@RomanPerekhrest我想这意味着一个介于0.7-0.8
之间的值。col1有0.74
和col4有0.75/0.72/0.78
天哪!你是个救命稻草!它可以工作。因为我的实际数据表很大,我不得不在一个相对较小的表上测试它,它工作了。我目前正在排队运行实际的数据集。我是肯定的我相信它会起作用的。谢谢!
$ awk -f rotate.awk file.tsv | awk -v n=0.7 -v m=0.8 '{x=0; for (i=2; i<=NF; i++) if ($i >= n && $i <= m) x=1} x' | awk -f rotate.awk
Sample1 Sample4
1 0.002
0.74 0.75
0.65 0.72
0.24 0.78
0.25 0.25
0.003 0.23
0.02 0.22
1 0.99
0.992 0.98
0.12 1
$ awk -v n=0.7 -v m=0.8 '{for (i=1; i<=NF; i++) if ($i >= n && $i <= m) print i}' file.tsv |
awk 'NR==FNR{c[$1];next} {tab="";for (i=1; i<=NF; i++) if (i in c) {printf "%s%s",tab,$i;tab="\t"} printf "\n" }' - file.tsv
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
if (FNR > 1) {
for (i=1; i<=NF; i++) {
if ( ($i >= 0.7) && ($i <= 0.8) ) {
good[i]
}
}
}
next
}
{
c=0
for (i=1; i<=NF; i++) {
if (i in good) {
printf "%s%s", (c++ ? OFS : ""), $i
}
}
print ""
}
$ awk -f tst.awk file file
Sample1 Sample4
1 0.002
0.74 0.75
0.65 0.72
0.24 0.78
0.25 0.25
0.003 0.23
0.02 0.22
1 0.99
0.992 0.98
0.12 1