编辑:
嘿用户84771,
所以我完全根据你所说的重新修改了我的答案。它还有几行,但希望这是您正在寻找的:
为了从类似于 Mysql 中的 group by 的“每个 ID”中找到最大的行,我会执行以下操作。
给定以下文本文件:
[root@dev7 ~]# cat stackoverflow2.log
ID1, fdsgfdsggfdsgsdfg
ID1, fdsgsdfg
ID1, fdsgfdgdsfgdsgsdfgdgffdsgfsdg
ID1, fdsgsdfg
ID2, fdgsfdsgfdshshdsfhdfghdsfhdfhdshsdfhsfdh
ID2, fsfgsdgf
ID3, fdgfdgdgfdggfdg
[root@dev7 ~]#
我会做以下事情:
_DATAFILE=stackoverflow2.log
_KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq | sed "s,\,,,g" | xargs )
_LARGEST_PER_KEY=""
echo $_KEYS
for i in ${_KEYS}; do
_LARGEST_PER_KEY="${_LARGEST_PER_KEY}\n$(grep "$i" ${_DATAFILE} | uniq | awk '{ print length ":", $0 }' | sort -n -u | tail -1 | cut -d ":" -f2 | awk '{ $1=$1; print}')"
done;
echo -e ${_LARGEST_PER_KEY}
解释发生了什么。
- _DATAFILE - 此变量是您的输入文件。
- _KEYS - 此变量返回第一列中的所有键(uniq 和无关联数据排序)。我使用 xargs 确保所有键都放在一条直线上以供下一步使用。
[root@dev7 ~]# _KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq | sed "s,\,,,g" | xargs )
[root@dev7 ~]# echo $_KEYS
ID1 ID2 ID3
_LARGEST_PER_KEY - 我们完成后,此变量将用于您的结果。我们在 for 循环之前在这里定义它。
for 循环对 quest 中的键(例如 ID1)执行 grep,然后执行我的表单代码行以确定哪个包含最长的数据值,并执行数字/uniq 排序以查看哪个是最大的。我们使用 tail 获取该值并将其附加到我们的 _LARGEST_PER_KEY 字符串中。(注意:我们添加 \n 字符作为分隔符)
一旦 for 循环完成,我们就使用 echo -e 回显结果,以确保换行符在屏幕上得到正确评估:
[root@dev7 ~]# echo -e ${_LARGEST_PER_KEY}
ID1, fdsgfdgdsfgdsgsdfgdgffdsgfsdg
ID2, fdgsfdsgfdshshdsfhdfghdsfhdfhdshsdfhsfdh
ID3, fdgfdgdgfdggfdg
注意:由于我们一开始就对所有内容进行了排序,因此应该没有理由再次排序。
澄清说明:
awk '{ $1=$1; print}' - 这将删除尾随空格(行首/行尾)
uniq - 去除重复
awk '{ print length ":", $0 }' - 获取每行的行长,用 "lenghth of line" 打印出来:"line test"
sort -n -u - 数字排序(最大的数字是最后一项)。如果数据文件未排序,还可以确保整个文件被唯一排序。感谢
格伦的提示。
tail -1 - Grab 的最后一行,因为它是最大的
cut -d ":" -f2 - 如果你只想要确切的行,去掉行的长度,只需返回行
awk '{ $1=$1; print}' - 这将删除尾随空格(行首/行尾)
同样,我确信有一种更有效的方法来做到这一点,但这是我能够想出的。希望这可以帮助!