Bash:删除具有唯一时间戳的重复行

时间:2014-04-02 18:57:50

标签: bash awk

也许你们可以帮助为这个应用程序创建一个自定义的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}

5 个答案:

答案 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]++'删除重复记录。