【问题标题】:filter out data from file on the basis of other in awk根据awk中的其他过滤掉文件中的数据
【发布时间】:2016-05-27 11:09:10
【问题描述】:

我有一个大文件,有 50 列和 10 万行,由 | 分隔。现在 $2(col 2) 有多种类型的 $1(col 1) 值,这意味着 col 2 将被重复。所以我已经对文件进行了排序。 我现在需要根据以下条件提取/过滤结果文件:

  • 条件1:当$2同时具有$1的类型时($2$1的值大于8000以及小于8000)然后选择完整的行这是$1$2 为 8000
  • 条件2:如果$2只有$1 > 8000,则选择具有最大$8值的完整行

例如:源文件

4000|1234||||||23
5000|1234||||||22
9000|1234||||||25
10000|123|||||||22
22000|456|||||||27
15000|456|||||||29

结果文件有:

9000|1234||||||25
10000|123|||||||23
15000|456|||||||29

有人可以请教一下吗?提前致谢

【问题讨论】:

  • 为什么22000 没有输出?
  • 为什么没有输出 22000? ANS-- 因为 $2(456) 的值只有 >8000,所以基于 $9 (29) 选择的行的最大值为 29>27
  • 不清楚,为什么123 行没有在最后一列显示22
  • $2同时具有$1这两种类型时"是什么意思?
  • 措辞不清楚。 Now $2(col 2) has multiple type of $1(col 1) value which means col 2 will be repeated. -- multiple type 是什么意思?

标签: linux bash shell awk gawk


【解决方案1】:

这是答案:我得到了...

 sort -n -t\| -k2 -k1 < sortexp.txt |awk -F\| '$1 < 8000 { a[$2]++ ; print } $1 >= 8000 { if ( !a[$2] && ( !e[$2] || e[$2]<$8 ))  {u[$2]=$0;e[$2]=$8;} ; } END { for ( i in u ) print u[i] ;}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多