web-dev-qa-db-ja.com

大きなテキストファイルから列を抽出する

    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を超える列があります。

3
jyoti

これを試して。必要なフィールド(この場合は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
$
1
steve
Perl -pale '
   $. == 1 and ($idx) = grep { $F[$_] eq "AvgVal" } 0..$#F;
   $_ = $F[$idx];
' yourfile

最初に、レコード1のフィールドを調べ、それを使用してデータを印刷することにより、印刷しようとしている列番号をロックします。

1
user218374

シェルスクリプトを使用した別のアプローチ:

#!/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
0
Ashish K

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
0
George Vasiliou