【问题标题】:Passing -I pattern through multiple xargs通过多个 xargs 传递 -I 模式
【发布时间】:2016-02-18 22:18:29
【问题描述】:

我有一个文件列表

$ls
reads_string1
reads_string2
reads_string3

我想在每行的第 2、6、10、...、N 行搜索并计算 reads_string1 中的 string1reads_string2 中的 string2reads_string3 中的 string3 的出现次数各自的文件(因此在下面使用 awk)

为此,我希望能够通过两个 xargs 传递 xargs 模式。这是我目前不起作用的“解决方案”。

ls reads_* | cut -d"_" -f2 | xargs -I pattern awk '{if (NR % 2 == 0 && NR % 4 != 0){print}}' reads_pattern | xargs grep -Hc "^pattern" reads_pattern

有没有办法将模式从第一个 xargs 传递到第二个 xargs?

【问题讨论】:

    标签: grep sh xargs


    【解决方案1】:

    你可以只用 awk 来实现:

    awk '{
          f=FILENAME;
          gsub('/^.*_/',"",f);
          if(FNR%4==2 && $0 ~ "^"f )
            {a[f]++
           }
          }
          END{
            for (i in a){
            print i,a[i]
            }
          }' reads_*
    

    这将使用 awk 内置变量 FILENAME 并将其解析为变量 f 以获取 string1string2 等。

    那么如果FNR的模数4等于2(匹配行号2、6、10.....)并且该行以f(即string1string2为currespnigng 文件),数组a 中索引为f 的值增加1。

    最后打印索引以及具有该索引的数组,即计数。

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多