+ -
当前位置:首页 → 问答吧 → 管道符与awk一齐使用的问题

管道符与awk一齐使用的问题

时间:2011-06-21

来源:互联网

今天做一个统计,对目录下的所有一种类型的文件(格式相同)中的一个字段求和统计
使用命令如下:
ls | grep AAA_ | xargs awk -F'|' '{a=a+$1} END{print a}'
执行完毕之后,惊奇的发现的并不是最后只打印一个结果
而是出现了三行结果,结果分别都不一样
统计了该目录的该文件数为 2000多个
ls | grep AAA_  | wc -l         
这是不是跟 xargs 取的记录数有关?
导致这两千多个文件分段按三次取出统计的?
请各位大侠指点一下

作者: sunway820   发布时间: 2011-06-21

回复 sunway820


    我觉得,LZ可以分批次计算啊,具体xargs的最大接受参数量与什么相关我不会了,看看哪个高手路过解释下了……
   不知道这个:ls | grep AAA_ | xargs -n100 awk -F'|' '{a=a+$1}END{print a}' | awk '{a=a+$1}END{print a}' 可不可以,每次xargs输入100个参数,然后通过两次awk,个人想法而已!期待高手解答了

作者: lionfun   发布时间: 2011-06-22

本帖最后由 yinyuemi 于 2011-06-22 01:32 编辑

回复 sunway820


    这个?
  1. ls | grep AAA_ | xargs -n1 -I {} awk -F'|' '{a=a+$1} END{print a}' {}
复制代码

作者: yinyuemi   发布时间: 2011-06-22

回复 yinyuemi


    SS兄,能不能给小弟我解释下你的脚本啊 特别是这个-i 选项

作者: lionfun   发布时间: 2011-06-22

本帖最后由 yinyuemi 于 2011-06-22 02:17 编辑

回复 lionfun



应该是用-I,大写的,小写的i已经废弃不使用,我已经改过来了。

我的理解,参考一下,呵呵
-I  replace-str , 如果没有指定参数的话,默认情况下replace-str写成{},是前一个管道传来的标准输入,

第二个{}和第一个是一样的,作为awk的标准输入的文件名。

再举个例子:
  1. ls
  2. a
  3. b
  4. c

  5. ls |xargs -n1 -I {} mv {} {}.bak

  6. 等同于

  7. mv a a.bak
  8. mv b b.bak
  9. mv c c.bak

  10. 即把所有文件备份
复制代码

作者: yinyuemi   发布时间: 2011-06-22

饿。。。猫头鹰真多~

作者: xrzs1986   发布时间: 2011-06-22