큰 텍스트 파일에서 열 추출

큰 텍스트 파일에서 열 추출
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

쉘 스크립트를 사용하는 또 다른 방법:

#!/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

관련 정보