Awk无法解析亵渎符号

Awk无法解析亵渎符号,awk,Awk,awk脚本 awk 'BEGIN {FS = "\t"} $1==prev {printf "\t" $2} $1 != prev {printf "\n" $1,$2} {prev=$1}' 当它遇到亵渎的台词时就会倒下。下面的行在括号中用制表符分隔 Richard Pryor... Here and Now (1983) stand-up Richard Pryor... Here and Now (1983) stand-up-comedian Richard P

awk脚本

awk 'BEGIN {FS = "\t"} $1==prev  {printf "\t" $2} $1 != prev {printf "\n" $1,$2} {prev=$1}' 
当它遇到亵渎的台词时就会倒下。下面的行在括号中用制表符分隔

Richard Pryor... Here and Now (1983)    stand-up  
Richard Pryor... Here and Now (1983)    stand-up-comedian  
Richard Pryor... Here and Now (1983)    stand-up-comedy  
Richard Pryor: I Ain't Dead Yet, #*%$#@!! (2003)    african-american 
获得的误差

awk: cmd. line:1: (FILENAME=temp.list FNR=4) fatal: arg count with `$' must be > 0
另一行同样包含亵渎,但没有解析

Merry F#%$in' Christmas (2005)  censored-profanity-in-title
同样,该选项卡位于括号中的年份之后。

printf错误解释了您看到的问题:printf在格式说明符之后需要一个逗号:

Richard Pryor... Here and Now (1983)    stand-up  
Richard Pryor... Here and Now (1983)    stand-up-comedian  
Richard Pryor... Here and Now (1983)    stand-up-comedy  
Richard Pryor: I Ain't Dead Yet, #*%$#@!! (2003)    african-american 
{printf "\t%s", $2} 
{printf "\n%s\t%s", $1,$2}
使用它的方式是,将换行符和$1连接起来,形成格式说明符。由于$1包含未捕获的%,printf会混淆并抛出错误

此外,您的最后一行不会以换行符结尾,因此在末尾添加此子句:

END {print ""}
printf错误解释了您看到的问题:printf在格式说明符后面需要一个逗号:

{printf "\t%s", $2} 
{printf "\n%s\t%s", $1,$2}
使用它的方式是,将换行符和$1连接起来,形成格式说明符。由于$1包含未捕获的%,printf会混淆并抛出错误

此外,您的最后一行不会以换行符结尾,因此在末尾添加此子句:

END {print ""}
printf是造成语法问题的原因,这是正确的

一种优雅的方法是使用关联数组来构建字符串,这避免了复杂的边缘情况:

$ awk -F'\t' '{a[$1]=a[$1] (a[$1]?FS $2:$0)} END{for (k in a) print a[k]}' file
printf是造成语法问题的原因,这是正确的

一种优雅的方法是使用关联数组来构建字符串,这避免了复杂的边缘情况:

$ awk -F'\t' '{a[$1]=a[$1] (a[$1]?FS $2:$0)} END{for (k in a) print a[k]}' file

一个优雅的解决方案。输出的顺序将是随机的。使用GNU awk,您可以使用PROCINFO[sorted_in]=@ind_str_asc按索引值进行排序。请参阅Good tip@glennjackman我的基本假设是文件已按字典顺序排序,因此您可以在awk之后对其进行排序,以获得相同的顺序。这种方法的另一个好处是,文件不需要排序就可以工作。我处理的文件是250MB。我不想创建这么大的数组。一个优雅的解决方案。输出的顺序将是随机的。使用GNU awk,您可以使用PROCINFO[sorted_in]=@ind_str_asc按索引值进行排序。请参阅Good tip@glennjackman我的基本假设是文件已按字典顺序排序,因此您可以在awk之后对其进行排序,以获得相同的顺序。这种方法的另一个好处是,文件不需要排序就可以工作。我处理的文件是250MB。我不想创建这样大小的数组。