【问题标题】:How to do filtering of multiple files in a directory using awk?如何使用awk过滤目录中的多个文件?
【发布时间】:2015-03-19 00:29:22
【问题描述】:

我正在尝试根据黑名单文件过滤目录中的多个文件 当我使用没有循环的单行时,脚本工作正常......

 awk >rest.txt 'NR==FNR{_[$1];next}!($1 in _)' FS=" " blist_file.txt main_file.txt

但是当我添加一个循环时,我得到了错误,可能是什么问题?

$ for f in main_file* do awk >res_$f 'NR==FNR{_[$1];next}!($1 in _)' FS=" " blist_file.txt $f; done
-bash: syntax error near unexpected token `>

【问题讨论】:

  • >rest.txt 有什么作用?我从未在awk 中看到过这样的重定向。正常使用:awk 'test {do something}' infile > outfile

标签: loops awk gawk


【解决方案1】:

您缺少一个分号。这个:

for f in main_file* do

在语法上应该是这样的:

for f in main_file*; do

但无论如何,这当然是错误的方法 - 只需调用一次 awk:

awk '
    NR==FNR {blist[$1]; next }
    FNR==1 {close(out); out="res_" FILENAME }
    !($1 in blist) { print > out }
' blist_file.txt main_file*.txt

您不需要将 FS 设置为 " ",因为这是默认值,并且无论您在哪里了解到使用“_”作为变量名是个好主意 - 永远不要再使用该来源!

【讨论】:

  • 感谢@EdMorton 的提示
  • 我测试了脚本,如果输出文件不为空,它将生成一个输出文件。即使输出中没有内容,我怎么能生成一个空文件?
  • 不确定我是否理解您的要求,但我认为您想要的只是在 FNR==1 块的末尾添加 printf "" > outFNR==1 {close(out); out="res_" FILENAME; printf "" > out }
  • 是的,这正是我正在寻找的输出。谢谢指点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多