大容量ファイルをいくつかの部分に分割したいです。分割後のファイル名とファイルあたりのレコード数は、awkに引数/変数として与えられます。
EG:(FILENAME=A_20
100レコードがあると仮定)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
実行される前にエラーが発生します。すでにawk
awk
持つ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.txt
2つのファイルに分割されますA_20-02.txt
。
を使用するには、awk
以下を試してください。
awk -v lineno=50 '((NR-1)%lineno)==0{cnt++;f=FILENAME "-" cnt ".txt"}{print >>f}' A_20