[英]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
它看起来好像你正在尝试计算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.