Awk 命令在重定向期间失败且字符串值为空

Awk 命令在重定向期间失败且字符串值为空

我想将大文件分成几部分。文件名和分割后每个文件的记录数将作为参数/变量提供给 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之前就会产生错误。已经awkawkFILENAME您可以使用一个名为的变量。它是当前输入文件的名称。

使用-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_202 个各 50 行的文件,分别称为A_20-01.txtA_20-02.txt


如果你想使用awk,你可以试试这个:

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

相关内容