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