从大型文本文件中提取列

从大型文本文件中提取列
MaxVal  MinVal  AvgVal
3.8959  0.795   2.249071429
3.8416  0.7761  2.280848
3.896   0.7949  2.221309804
3.8727  0.7746  2.252477966
3.8953  0.7957  2.225252

假设我想提取标题为“AvgVal”的列。我该如何使用sed/grep命令来做到这一点。实际文件有超过 1000 列。

答案1

perl -pale '
   $. == 1 and ($idx) = grep { $F[$_] eq "AvgVal" } 0..$#F;
   $_ = $F[$idx];
' yourfile

我们首先通过遍历记录 1 的字段来锁定要打印的列号,然后使用它来打印数据。

答案2

尝试这个。在第一行中搜索所需的字段(本例中为 AvgVal),并将列号存储在变量 a 中。然后对于每一行将 $0 设置为我们想要的列。由于默认行为是打印 $0,这样就达到了目标。

$ awk 'NR==1{while($++a!="AvgVal");}{$0=$a}1' filename
AvgVal
2.249071429
2.280848
2.221309804
2.252477966
2.225252
$

答案3

另一种使用 shell 脚本的方法:

#!/bin/sh

filename=file.txt
search="AvgVal"

column_num=`awk -F' ' '{ for (i = 1; i <= NF; ++i) print i, $i; exit } ' $filename | grep $search | awk '{ print $1 }'`
awk -v x=$column_num '{ print $x }' $filename

答案4

使用 AWK,这将扫描所有字段,直到找到所需的标题,然后打印找到的列:

$ a=$'MaxVal\tMinVal\tAvgVal\n3.8959\t0.795\t2.249071429\n3.8416\t0.7761\t2.280848'

$ echo "$a"
MaxVal  MinVal  AvgVal
3.8959  0.795   2.249071429
3.8416  0.7761  2.280848

$ awk 'NR==1{for (i=1;i<=NF;i++) if ($i=="AvgVal") {a=i;break}}{print $a}' <<<"$a"
AvgVal
2.249071429
2.280848

相关内容