怎么知道怎么做

时间:2011-06-30 15:10:46

标签: awk gawk

我使用awk,并希望将任意数量的文本文件(参数)发送到我的脚本中,并为每个输入文件“打印一些东西”。

我找到了脚本here

并将脚本修改为此

awk -v nfiles="10" 'NR==FNR{a[$0]++;next}
$0 in a {a[$0]++; next}
{b[$0]++}
END{
  for(i in a){
    if(a[i]==nfiles) {
      print i > "output1"
    }
    else if(a[i]==1) {
        print i > "output3"
    }
  }
  for(i in b){
    if(b[i]==nfiles-1) {
        print i > "output2"
    }
  }
}' "$@"

问题是我在nfiles="10"写什么,因为它应该是任意数量的文本参数?

此外,我完全不理解这个脚本,它只执行本节

 else if(a[i]==1) {
        print i > "output3"
    }

只打印出来自file1.txt的信息。为什么不执行剩下的工作呢?如果我想将第3行($3)中的所有文件从所有文件打印到output3怎么办? 谢谢=)

3 个答案:

答案 0 :(得分:1)

如果要将每个文件的第3列$ 3打印到单个输出文件中, 你可以使用这样的东西:

awk '{ print $3 }' file1 [file2 .. filen] > output3

如果要打印每个文件的第三行:

awk 'FNR == 3' file1 [file2 .. filen] > output3

当然,您可以使用 glob 来匹配您的文件:

awk '{ print $3 }' common_pattern* > output3

答案 1 :(得分:0)

而不是传递nfiles=10,而不是将其作为第一个动作添加到您的awk脚本中。

FNR==1 {nfiles++}

答案 2 :(得分:0)

用于计算添加的文件数:

awk 'BEGIN {nfiles = ARGC-1}
...
}' "$@"