Linux awk打印行问题

Linux awk打印行问题,linux,macos,awk,Linux,Macos,Awk,我现在在使用awk命令时遇到一些问题。原始脚本是在MacOS上使用awk开发的,然后移植到Linux。那里awk显示了不同的行为 我想做的是计算通过文件/tmp/test.uniq.txt中的/tmp/test.txt提供的单个字符串的出现次数 awk '{print $1, system("cat /tmp/test.txt | grep -o -c " $1)}' /tmp/test.uniq.txt Mac提供了如下预期输出: test1 2 test2 1 2 test1

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

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

awk '{print $1, system("cat /tmp/test.txt | grep -o -c " $1)}' /tmp/test.uniq.txt
Mac提供了如下预期输出:

  test1 2 
  test2 1
2
test1 1
test2 
输出在一行中,sting和出现次数用空格分隔

Linux提供如下输出:

  test1 2 
  test2 1
2
test1 1
test2 
输出不在一行中,系统命令的输出首先打印

样本输入: test.txt看起来像:

test1 test test 
test1 test test
test2 test test
test.uniq.txt看起来像:

test1
test2

正如评论所建议的,不建议使用
grep
cat
system
功能,因为
awk
是可以执行大多数任务的完整语言

您可以使用以下
awk
命令替换您的
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
请注意,此输出与计数
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
+
排序
+
uniq

grep -o -w -F -f uniq.txt test.txt | sort | uniq -c
这是一条管道,但很短

man grep

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

很好,您已经显示了您正在使用的代码,您必须向我们显示输入样本,因为如果我们可以在这里看到输入样本,您不需要在
awk
上使用
grep
等。在
awk
内部使用
cat/grep
最多是反模式
Awk
本身在执行所需处理时功能强大。发布正确的输入和预期的输出以获得更好的解决方案我同意,但这是我发现的唯一一个具有出现次数的字符串的解决方案。@david:对于给定的输入,您预期的输出是什么?输出中应该代表什么?鉴于您提供的输入,我无法复制您的输出。您的代码似乎试图为
uniq
文件中的每个条目显示
test.txt
中的行数。是吗?是的,5的计数与我的旧样本数据有关。谢谢你的解决方案。