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を超える列があります。
これを試して。必要なフィールド(この場合は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
$
Perl -pale '
$. == 1 and ($idx) = grep { $F[$_] eq "AvgVal" } 0..$#F;
$_ = $F[$idx];
' yourfile
最初に、レコード1のフィールドを調べ、それを使用してデータを印刷することにより、印刷しようとしている列番号をロックします。
シェルスクリプトを使用した別のアプローチ:
#!/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
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