Uniq -c基于bash脚本中的最后两列

时间:2017-06-19 10:29:33

标签: bash shell awk

我有下面的输入文件,我现在需要找出最后一列的出现而不管其他列。

我试过这段代码但没有用过

cat filename.txt | sort -t'|' -k3,4 | uniq -c -f1


输入
17年9月6日| 19:14:05.862 | 61284017123 | 505023892353450
17年9月6日| 19:29:48.409 | 61284017123 | 505023892353457
17年9月6日| 19:30:05.648 | 61284017123 | 505023892353457
17年9月6日| 19:44:46.0​​85 | 61284017123 | 505023892353457
17年9月6日| 04:23:03.038 | 61284017941 | 505023892353450
17年9月6日| 04:30:50.691 | 61284017942 | 505023892353451
17年9月6日| 04:43:48.407 | 61284017942 | 505023892353451
17年9月6日| 04:27:50.293 | 61284017944 | 505023892353453
17年9月6日| 03:51:24.130 | 61284017949 | 505023892353458
17年9月6日| 04:06:45.220 | 61284017949 | 505023892353458


预期输出
没有发生和任何一行
17年9月6日| 19:14:05.862 | 61284017123 | 505023892353450 | 2
17年9月6日| 19:29:48.409 | 61284017123 | 505023892353457 | 3
17年9月6日| 04:30:50.691 | 61284017942 | 505023892353451 | 2
17年9月6日| 04:27:50.293 | 61284017944 | 505023892353453 | 1个
17年9月6日| 03:51:24.130 | 61284017949 | 505023892353458 | 2

3 个答案:

答案 0 :(得分:1)

试试这个:

-u for unique

cat filename.txt | sort -t'|' -k3,4 -u

答案 1 :(得分:1)

这个双解析解决方案在这里工作,即首次计数出现,然后打印带有计数的唯一行:

parse.awk

BEGIN { FS = OFS = "|" }

FNR==NR { 
  h[$NF]++
  next
}

$NF in h { 
  print $0 OFS h[$NF]
  delete h[$NF]
}

像这样运行:

awk -f parse.awk input{,}

输出:

09-06-17|19:14:05.862|61284017123|505023892353450|2
09-06-17|19:29:48.409|61284017123|505023892353457|3
09-06-17|04:30:50.691|61284017942|505023892353451|2
09-06-17|04:27:50.293|61284017944|505023892353453|1
09-06-17|03:51:24.130|61284017949|505023892353458|2

答案 2 :(得分:0)

这对我有用:) awk -F'|' '!z[$4]++{ a[$4]=$0; } END {for (i in a) print a[i]"|" z[i]}' filename

相关问题