如何通过在awk
using for
/while
循环中传递 shell 变量来循环并实现以下目标?
我有一个如下所示的文本文件。
mark 10 20 30
lawrence 40 22 60
mark 11 12 13
mike 15 16 17
lawrence 21 22 23
mike 31 32 33
mike 41 42 47
我希望输出如下所示(第二列表示每个名称出现的次数)
我还有一个要求抱歉再次询问输出会像
如果标记的值为 20(在第三列中),则其出现应打印在下一列中
如果 mike 的值为 32(在第三列中),则其出现情况应打印在下一列中
如果 lawrence 的值为 22(在第三列),则应在下一列打印它的出现
标记 2 1
麦克 3 1
劳伦斯 2 2
这就是它的样子。我希望文本文件按如下方式传递。你能帮忙吗?
我现在使用的命令
n=$(date +"%Y%m%d");
LogDataN=`tail -10 "$n".txt` -- my text file which contains the above data
A=`echo "$LogDataN" | awk '{ c["$1"]++ } END { for (name in c) print name, c[name] }' `
echo "$A"
答案1
我不太明白为什么您想要将任何 shell 变量传递到awk
这里。
tail "$(date +'%Y%m%d.txt')" |
awk '{ c[$1]++ } END { for (name in c) print name, c[name] }'
tail
默认情况下从给定文件中提取最后 10 行文本,因此不需要-n 10
(或已弃用的)。-10
该date
命令用于创建要读取的文件名。
该awk
代码使用第一列作为关联数组中的键c
,该数组保存每个名称出现的次数。从文件中读取的每一行,名称的计数都会增加。最后,输出名称和相关计数。
请注意,这里没有使用 shell 变量。