所以我正在运行我为语言建模任务编写的脚本。在“to_remove =”行中,它出错“/ usr / bin / awk:参数列表太长”,即使只有4个参数
我的代码:
echo "Removing n-grams that contain a word with count < $min_count"
counts=`cat combined_counts`
to_remove=`awk -v c=$min_count '( NF == 2 && $NF < c ) {print $1}' combined_counts`
for unigram in $to_remove; do
counts=`echo "$counts" | egrep -v "\b$unigram\s"`
done
echo "$counts" > combined_counts
输出:
Removing n-grams that contain a word with count < 3
/home/likewise-open/AD/bherman/new_decoder/language_model/scripts/create_lm: line 210: /usr/bin/awk: Argument list too long
我也尝试用以下方法替换麻烦的行:
awk -v c=$min_count '( NF == 2 && $NF < c ) {print $1}' combined_counts > unigrams_to_remove
但它给出了同样的错误,unigrams_to_remove文件为空。
最奇怪的是,当我之后立即从命令行运行相同的代码(意味着combined_counts文件未更改)时,它不会出错。
AD\bherman@cluster4:~/new_decoder/language_model/working/filter_tests
$ min_count=3
AD\bherman@cluster4:~/new_decoder/language_model/working/filter_tests
$ to_remove=`awk -v c=$min_count '( NF == 2 && $NF < c ) {print $1}' combined_counts`
AD\bherman@cluster4:~/new_decoder/language_model/working/filter_tests
$ echo "$to_remove" | wc -l
15211
答案 0 :(得分:3)
echo "Removing n-grams that contain a word with count < $min_count"
awk -v c=$min_count '( NF == 2 && $NF < c ) {print}' combined_counts |
grep -Fvxf - combined_counts > tmp
mv tmp combined_counts
编辑:
<强> clearification 强>
awk语句将所需的行删除并将它们输出到名为to_remove的文件中(而不是将其存储在一个巨大的数组中)。 下一行从combined_counts中减去to_remove中的行,并将其存储在名为tmp的文件中。 最后一行清理额外的文件并将所需的输出存储到原始文件中。
是的我知道grep -Fvxf
命令真的很酷,并且允许最小和优雅的脚本:D
EDIT2: 由于tripleee的评论,进一步培养了脚本!
EDIT3: 在脚本中修复拼写错误:将“{print}”更改为“{print $ 1}”
Edit4: 修复了awk的缺失文件参数
答案 1 :(得分:1)
您发布的脚本长度为7行,使用1个参数调用awk并且无法生成您发布的错误消息,并且无法从命令行重现运行隔离的awk脚本的错误。
您发布的错误消息:
/home/likewise-open/AD/bherman/new_decoder/language_model/scripts/create_lm: line 210: /usr/bin/awk: Argument list too long
抱怨某些shell脚本的第210行正在调用带有太多参数的awk。
因此,问题不在于您向我们展示的脚本。如果它是一些较大的脚本的一部分,那么在该脚本中更早看一下不匹配的引用或其他东西。您可以先注释掉它的一部分,直到您可以隔离需要存在的部分来输出错误。