也许你们可以帮助为这个应用程序创建一个自定义的awk
函数,因为我对bash没什么经验。
我有log.txt
毫秒时间戳和事务ID(用短划线分隔)。我想删除同一个id的最早条目,如果有的话。
1396464155-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
1396464330-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
1396464330-a0ae54a927d49e53f66a511e065a3cc99a35ae2eac215f01d99ea9cc59447185
到此
1396464330-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
1396464330-a0ae54a927d49e53f66a511e065a3cc99a35ae2eac215f01d99ea9cc59447185
这是我用于记录的脚本。应该在此处理解决方案,可能是在添加新条目之前检查是否存在重复的事务ID。
#!/bin/bash
F=./log.txt
D=`date +%s`
echo ${D}-${1} >> ${F}
答案 0 :(得分:1)
此awk
应该:
awk -F- '{a[$2]=$1} END {for (i in a) print a[i] FS i}' file
1396464330-a0ae54a927d49e53f66a511e065a3cc99a35ae2eac215f01d99ea9cc59447185
1396464330-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
使用a
作为索引,将时间戳保存到数组id
中。如果id
有多个时间戳,则只使用最新的时间戳。
测试文件
12-green
12-red
13-green
14-blue
15-orange
15-red
16-orange
awk -F- '{a[$2]=$1} END {for (i in a) print a[i] FS i}' file
16-orange
15-red
14-blue
13-green
获取输出
awk -F- '{a[$2]=$1} END {for (i in a) print a[i] FS i | "sort -nt-"}' file
13-green
14-blue
15-red
16-orange
答案 1 :(得分:1)
使用gnu awk
:
$ awk -F- '{a[$2]=$0}END{n=asort(a,s);while(++x<=n){print s[x]}}' file
1396464330-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
1396464330-a0ae54a927d49e53f66a511e065a3cc99a35ae2eac215f01d99ea9cc59447185
答案 2 :(得分:1)
使用grep:
#!/bin/bash
arg="$1"
Log="log.txt"
date=$(date +%s)
tmp=$(mktemp /tmp/log.XXXXXX)
grep -v -- "-$arg" "$Log" > $tmp && mv $tmp "$Log"
[ -f "$tmp" ] && rm -f $tmp
echo "$date-$arg" >> "$Log"
将其作为:
运行script.sh 640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
产生 - 从你的输入产生例如下一个
1396464330-a0ae54a927d49e53f66a511e065a3cc99a35ae2eac215f01d99ea9cc59447185
1396468423-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
答案 3 :(得分:1)
我添加了另一个awk
。这使用tac
来反转文件,以便我们获得具有最高日期的ID。
tac file | awk -F- '!a[$2]++' | tac
1396464330-640de058bac28a44b9fde9a6bbd4b5385588934a38ff543c004ecb94d47dc707
1396464330-a0ae54a927d49e53f66a511e065a3cc99a35ae2eac215f01d99ea9cc59447185
我的测试文件
tac test | awk -F- '!a[$2]++' | tac
13-green
14-blue
15-red
16-orange
答案 4 :(得分:1)
排序+ awk
sort -rn file|awk -F "-" '!a[$2]++'
sort -rn file
首先对文件进行排序
-n 按算术值对数字字段进行排序。数字字段可以 包含前导空格,可选减号,十进制数字, 千位分隔符和可选的基数字符。 包含任何非数字字符的字段的数字排序 给出了不可预测的结果。
-r 撤消指定排序的顺序。
awk -F "-" '!a[$2]++'
删除重复记录。