空の文字列値にリダイレクトしている間、Awk コマンドは失敗します。

空の文字列値にリダイレクトしている間、Awk コマンドは失敗します。

大容量ファイルをいくつかの部分に分割したいです。分割後のファイル名とファイルあたりのレコード数は、awkに引数/変数として与えられます。

EG:(FILENAME=A_20100レコードがあると仮定)NoOfRecordsPerFile=50 分割ファイル名は次のようになります。

A_20-1.txt
A_20-2.txt

私が使用するコマンドは次のとおりです。

awk -vNoOfRecordsPerFile -vFILENAME 'NR%NoOfRecordsPerFile==1{x=FILENAME"-"++i".txt"}{print > x}' $FILENAME

エラーが発生します。

awk: (FILENAME=A_20 FNR=1) fatal expression for `>' has null string value

私は何が間違っていましたか?

他のファイルにも同じコマンドが機能します。

答え1

FILENAME変数を次のように組み合わせます。値(コマンドラインに値を指定しない)を使用すると、スクリプトがFILENAME実行される前にエラーが発生します。すでにawkawk持つFILENAME名前付き変数を使用できます。現在の入力ファイルの名前。

を使用すると、-vNoOfRecordsPerFileコマンドラインで変数に値を割り当てたいが、awk決して値を割り当てないと言います。これはあなたが言うものとは異なるエラーを生成します。同じ名前のシェル変数値を使用するには-v NoOfRecordsPerFile="$NoOfRecordsPerFile"

したがって、最終awkコマンドは次のようになります。

awk -v NoOfRecordsPerFile="$NoOfRecordsPerFile" '
    ((NR-1) % NoOfRecordsPerFile) == 0 { x = FILENAME "-" ++i ".txt" }
                                       { print > x                   }' "$FILENAME"

答え2

エラーは、NR%NoOfRecordsPerFile==1変数を使用する前に満たされていない条件が原因で発生したため、x変数は設定されていません。

代わりに、awk次のものを使用できますsplit

split -l 50 -d --additional-suffix='.txt' --numeric-suffixes=1 A_20 'A_20-'

これにより、ファイルはA_20それぞれ50行ずつと呼ばれるA_20-01.txt2つのファイルに分割されますA_20-02.txt


を使用するには、awk以下を試してください。

awk -v lineno=50 '((NR-1)%lineno)==0{cnt++;f=FILENAME "-" cnt ".txt"}{print >>f}' A_20

関連情報