EDIT:
Hey 用户84771 https://stackoverflow.com/users/1953475/user84771,
所以我根据你所说的完全修改了我的答案。它还有几行,但希望这就是您正在寻找的内容:
为了从类似于 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}
解释发生了什么。
-
_数据文件- 该变量是您的输入文件。
-
_KEYS- 此变量返回第一列中的所有键(唯一且已排序(带/不带关联数据))。我使用 xargs 来制作
确保所有按键都排成一条直线以进行下一步。
[root@dev7 ~]# _KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq |
sed "s,\,g" | sed 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;打印}'- 这会删除尾随空格(行首/行尾)
uniq- 摆脱重复项
awk '{ 打印长度 ":", $0 }'- 获取每行的行长,用“length of line”打印出来:“line test”
排序 -n -u- 数字排序(最大数字是最后一项)。还确保整个文件的排序是唯一的,如果数据文件
到达时未分类。谢谢你的提示Glenn https://stackoverflow.com/users/7552/glenn-jackman.
tail -1- Grab 是自最大以来的最后一条线路
剪切-d“:”-f2- 如果您只想要精确的线条,请去掉线条的长度,只需返回线条即可
awk '{ $1=$1;打印}'- 这会删除尾随空格(行首/行尾)
再说一次,我确信有一种方法可以更有效地做到这一点,但这就是我能够想出的。希望这可以帮助!