【发布时间】:2017-02-03 12:26:10
【问题描述】:
我有一个结构如下的文件:
1486113768 3656
1486113768 6280
1486113769 530912
1486113769 5629824
1486113770 5122176
1486113772 3565920
1486113772 530912
1486113773 9229920
1486113774 4020960
1486113774 4547928
我的目标是消除第一列中的重复值,对第二列中的值求和并使用新列值更新该行:来自上面输入的工作输出将是:
1486113768 9936 # 3656 + 6280
1486113769 6160736 # 530912 + 5629824
1486113770 5122176 # ...
1486113772 4096832
1486113773 9229920
1486113774 8568888
我知道cut、uniq:到目前为止,我设法在第一列中找到了重复值:
cut -d " " -f 1 file.log | uniq -d
1486113768
1486113769
1486113772
1486113774
有没有“awk 方式”来实现我的目标?我知道它是一个非常强大和简洁的工具:我之前用过
awk '{print $2 " " $3 >> $1".log"}' log.txt
扫描 log.txt 中的所有行并创建一个以 $1 为名称的 .log 文件,并用 $2 和 $3 值填充它,所有这些都在一个 bash 行中(用read 循环!);有没有办法找到第一列重复项,对其第二列值求和并重写删除重复项的行并打印第二列的结果总和?
【问题讨论】:
-
您之前使用的那个 awk 脚本应该写成
awk '{print $2, $3 > ($1".log")}' log.txt以实现可移植性、健壮性、可维护性等。 -
这样做有很多充分的理由:谢谢,我会马上更正。
-
不客气。展望未来-当您发布问题时,最好等待几个小时后再接受答案,而不是仅仅接受您得到的第一个答案,因为一旦您接受答案,它甚至会阻止其他人查看您的问题和第一个答案可能不是你能得到的最好的。
-
我很抱歉,我急于得到我的情节工作,我接受了第一个工作答案,没有考虑空间和时间性能。您的答案似乎比接受的答案更有效。
-
@elmazzun,您可以更改选择以获得最佳答案。 :)