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的计数与我的旧样本数据有关。谢谢你的解决方案。