我想将大文件分成几部分。文件名和分割后每个文件的记录数将作为参数/变量提供给 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
,但您从未给它赋值。这应该会产生与您所说的错误不同的错误。如果您希望它采用同名的 shell 变量的值,请使用-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
2 个各 50 行的文件,分别称为A_20-01.txt
和A_20-02.txt
。
如果你想使用awk
,你可以试试这个:
awk -v lineno=50 '((NR-1)%lineno)==0{cnt++;f=FILENAME "-" cnt ".txt"}{print >>f}' A_20