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

おすすめ記事