我有一个具有以下结构的文件:
1486113768 3656
1486113768 6280
1486113769 530912
1486113769 5629824
1486113770 5122176
1486113772 3565920
1486113772 530912
1486113773 9229920
1486113774 4020960
1486113774 4547928
Run Code Online (Sandbox Code Playgroud)
我的目标是摆脱第一列中的重复值,将第二列中的值相加并使用新列值更新行:来自上面输入的工作输出将是:
1486113768 9936 # 3656 + 6280
1486113769 6160736 # 530912 + 5629824
1486113770 5122176 # ...
1486113772 4096832
1486113773 9229920
1486113774 8568888
Run Code Online (Sandbox Code Playgroud)
我知道cut,uniq到目前为止,我设法在第一列中找到重复值:
cut -d " " -f 1 file.log | uniq -d
1486113768
1486113769
1486113772
1486113774
Run Code Online (Sandbox Code Playgroud)
有没有"awk方式"来实现我的目标?我知道它是非常强大和简洁的工具:我之前使用它
awk '{print $2 " " $3 >> $1".log"}' log.txt
Run Code Online (Sandbox Code Playgroud)
扫描log.txt中的所有行并创建一个名为$ 1的.log文件,并用$ 2和$ 3值填充它们,所有这些都在一个bash行中(以read循环地狱!); 有没有办法找到第一列重复,加上第二列值并重写删除重复的行并打印第二列的结果总和?
Ini*_*ian 10
使用Awk如下,
awk '{ seen[$1] += $2 } END { for (i in seen) print i, seen[i] }' file1
1486113768 9936
1486113769 6160736
1486113770 5122176
1486113772 4096832
1486113773 9229920
1486113774 8568888
Run Code Online (Sandbox Code Playgroud)
{seen[$1]+=$2}创建一个散列映射,将$1其视为索引值,并且仅对$1文件中的那些唯一项增加总和.
$ awk '$1!=p{ if (NR>1) print p, s; p=$1; s=0} {s+=$2} END{print p, s}' file
1486113768 9936
1486113769 6160736
1486113770 5122176
1486113772 4096832
1486113773 9229920
1486113774 8568888
Run Code Online (Sandbox Code Playgroud)
上面的代码几乎不使用内存(仅 1 个字符串和 1 个整数变量),并将按照输入中出现的顺序打印输出。
如果您打算使用 awk,我强烈建议您阅读 Arnold Robbins 所著的《Effective Awk 编程》,第 5 版,这样您就可以学习如何编写自己的脚本,并且(在学习时)您可以了解其他脚本人们的脚本足够好,可以将正确的方法与错误的方法区分开来,给定两个脚本,在给定一些特定示例输入的情况下产生预期的输出。