아래와 같이 첫 번째 행에 헤더가 있는 다중 열 텍스트 파일이 있습니다.
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_fill
xy_fill
xy_fill
xy_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
?