繁体   English   中英

awk打印行问题

[英]awk Print Line Issue

我现在遇到了awk命令的一些问题。 原始脚本是在MacOS上使用awk开发的,然后移植到Linux。 awk显示了不同的行为。

我想要做的是计算文件/tmp/test.txt通过/tmp/test.uniq.txt提供的单个字符串的出现次数。

awk '{print $1, system("cat /tmp/test.txt | grep -o -c " $1)}' /tmp/test.uniq.txt

Mac提供了预期的输出,如:

  test1 2 
  test2 1

输出在一行中,sting和出现次数由空格分隔。

Linux提供如下输出:

2
test1 1
test2 

输出不在一行中,首先打印系统命令的输出。

示例输入:test.txt如下所示:

test1 test test 
test1 test test
test2 test test

test.uniq.txt看起来像:

test1
test2

由于评论建议不建议使用grepcat等使用system函数,因为awk是可以执行大部分这些任务的完整语言。

您可以使用以下awk命令替换您的cat | grep cat | grep功能:

awk 'FNR == NR {a[$1]=0; next} {for (i=1; i<=NF; i++) if ($i in a) a[$i]++} 
END { for (i in a) print i, a[i] }' uniq.txt test.txt

test1 2
test2 1

请注意,此输出与计数5不匹配,因为您的样本数据可能不同。


参考文献:

它看起来好像你正在尝试计算uniq文件中包含每个唯一字符串的行数。 但你正在做的方式是......尴尬,正如你所证明的那样,awk版本之间存在不一致。

以下可能会更好一点:

$ awk '
  NR==FNR {
    a[$1]
    next
  }
  {
    for (i in a) {
      if ($1~i) {
        a[i]++
      }
    }
  }
  END {
    for (i in a)
      printf "%6d\t%s\n",a[i],i
  }
' test.uniq.txt test.txt
         2  test1
         1  test2

这会将您的uniq文件加载到一个数组中,然后对于文本文件中的每一行,逐步执行数组以计算匹配。

请注意,这些是作为正则表达式进行比较,没有字边界,因此test1也将被计为test12一部分。

另一种方法可能是使用grep + sort + uniq

grep -o -w -F -f uniq.txt test.txt | sort | uniq -c

这是一条管道但很短的管道

man grep

  • -F , - --fixed-strings , - --fixed-regexp PATTERN解释为固定字符串列表,由换行符分隔,其中任何一个都要匹配。 -F由POSIX指定, - --fixed-regexp是废弃的别名,请不要在新脚本中使用它。)
  • -f FILE , - --file=FILE从FILE获取模式,每行一个。 空文件包含零模式,因此不匹配任何内容。 -f由POSIX指定。)
  • -o , - --only-matching仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
  • -w , - --word-regexp仅选择包含构成整个单词的匹配项的行。 测试是匹配的子字符串必须位于行的开头或前面是非单词构成字符。 同样,它必须位于行的末尾或后跟非单词构成字符。 单词构成字符是字母,数字和下划线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM