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