awk에서 동적으로 값을 전달하는 방법

awk에서 동적으로 값을 전달하는 방법

나는 노력한다너무 많은 행이 포함된 csv 파일을 사용자 정의 청크로 분할합니다. 행, 다음 스크립트를 사용하여그러나 출력이 생성되지 않고 파일이 생성되지만 비어 있습니다. 누구든지 누락된 부분을 지적해 주실 수 있나요?

# !/bin/bash
File=filename.csv
count=`awk 'END {print NR}' $File`
i=2
j=5000
k=$j
while [ $j -le $count ]
  do
    awk 'NR==1 {print $0}' $File > output"$i".csv
    awk 'NR==$i, NR==$j {print $0}' $File > output"$i".csv
    i=`expr $j + 1`
    j=`expr $i + $k`
    if [ $j -gt $count ]
      then
        j=$count
        k=`expr 0 - 1`
    elif [ $j -eq $count]
      then
        break
    fi
done

답변1

정말로 사용하고 싶다면 awk어떻게 해야 할까요 ?

awk -v c=5000 '
    BEGIN{getline; head=$0; f = -1}
    {if (f != int((NR-2)/c)) {f+=1; fl=sprintf("%03d.csv", f); print head > fl}; print $0 > fl}
    ' filename.csv

당신의 스크립트에 관해서는 ...

#!/bin/bash
File=filename.csv
count=$(awk 'END {print NR}' $File) # syntax
i=2
j=5000
k=$j
while [ $j -le $count ]
  do
    awk 'NR==1 {print $0}' $File > output"$i".csv
    # you cannot pass shell variables directly into awk, use -v
    # and append >> don't overwrite >
    awk -v st=$i -v fi=$j 'NR==st, NR==fi {print $0}' $File >> output"$i".csv 
    i=`expr $j + 1`
    j=`expr $i + $k`
    if [ $j -gt $count ]
      then
        j=$count
        k=-1
    elif [ $j -eq $count ] # needed a space before the ]
      then
        break
    fi
done

관련 정보