부분 일치 대신 해당 단어와 정확히 일치하는 단어에 대해 열 머리글을 검색하려면 어떻게 해야 합니까? [복사]

부분 일치 대신 해당 단어와 정확히 일치하는 단어에 대해 열 머리글을 검색하려면 어떻게 해야 합니까? [복사]

아래와 같이 첫 번째 행에 헤더가 있는 다중 열 텍스트 파일이 있습니다.

Name  xy_fill zxy_fill tz_fill 
Fox    0      5        55
Snake  1      6        14
wolf   8      1        2

헤더는 이름이 지정된 배열에 저장됩니다 hdr. 여기에는 이 다중 열 텍스트 파일에서 이 배열의 각 요소를 검색 xy_fill tz_fill 하고 싶습니다 . hdr나는 이 awk방법을 사용하고 있다

for ii in ${hdr[@]}
do

  gawk -vcol="$ii" -F  $'\t' '                                 
    $0 ~ col{
   for(s=1;s<=NF;s++){                        
          heading=$s                                  
         colhdr[s]=heading
         if(index(heading, col))wanted[s]=1
       }
    }
   '

done

그러나 검색할 때 xy_fill및 열이 표시됩니다. 어떻게 열만 읽을 수 있나요? 예를 들어, 검색하면 열 번호 1이 반환되어야 하지만 내 스크립트는 1과 2를 반환하는데 이는 잘못된 것입니다.zxy_fillxy_fillxy_fillxy_fill

답변1

csvcut다음에서 사용csvkit:

# if file is tab-delimited:
csvcut -t -c xy_fill,tz_fill file

# if file is space-delimited
csvcut -d' ' -S -c xy_fill,tz_fill file

배열을 입력으로 사용하려면 다음이 필요합니다.쉼표로 구분하여 변환하세요.값:

hdr=(xy_fill tz_fill)
hdr_csv=$(IFS=,;echo "${hdr[*]}")
csvcut -t -c "$hdr_csv" file # tab-delimited
# or
csvcut -d' ' -S -c "$hdr_csv" file # space-delimited

| csvformat -T출력을 다시 탭으로 구분하려면 끝에 이것을 추가하십시오.

산출:

xy_fill tz_fill
0   55
1   14
8   2

답변2

$ awk -v tgt='xy_fill' 'NR==1{for (i=1;i<=NF;i++) f[$i]=i} {print $(f[tgt])}' file
xy_fill
0
1
8

답변3

당신이 그것을 원한다면 xy_fill왜 단순하게 유지하지 않습니까 awk '{print $2}' testfile?

관련 정보