【问题标题】:Extract rows from table where values are less than and greater than in columns in shell从表中提取值小于和大于shell中列的行
【发布时间】:2020-10-23 05:56:01
【问题描述】:

我有一个非常大的制表符分隔表(大小为 24 GB),其中包含 C1 和 C2 、 C3 和 C4 列,如下所示。我想提取 C1

C1     C2    C3     C4
0.8    0.1   A1     C.a 
0.2    0.3   A2     C.b
0.5    0.8   A3     C.c
0.1    0.1   A4     C.c

我期望的结果:

C1     C2    C3     C4
0.2    0.3   A2     C.b
0.1    0.1   A4     C.c

【问题讨论】:

  • 如果我的回答对您有帮助,请告诉我吗?

标签: bash shell unix awk


【解决方案1】:

第一个解决方案:这个简单的awk 应该可以为您解决问题。

awk 'FNR==1 || ($1<.6 && $2<.4)' Input_file

对于制表符分隔的 Input_file 或尝试以下操作:

awk 'BEGIN{FS=OFS="\t"}FNR==1 || ($1<.6 && $2<.4)' Input_file


第二个解决方案(通用一):如果您不想硬编码字段 c1 和 c2 的字段编号并想获得它以编程方式然后尝试关注。如果您的 Input_file 是 TAB 分隔的,请在后面添加 BEGIN{FS=OFS="\t"}。

awk -v c1Thre="0.6" -v c2Thre="0.4" '
FNR==1{
  for(i=1;i<=NF;i++){
    if($i=="C1"){ C1Field=i }
    if($i=="C2"){ C2Field=i }
  }
  print
  next
}
$C1Field<c1Thre && $C2Field<c2Thre
'  Input_file

【讨论】:

  • 短一点:awk -F '\t' 'NR==1 || ($1&lt;.6 &amp;&amp; $2&lt;.4)' file
  • @anubhava,谢谢先生现在编辑了解决方案,当 Input_file 不是 \t 分隔时保留 2 个解决方案 1,当 Input_file 在这里用制表符分隔时保留另一个解决方案。
【解决方案2】:

试试这个: 我已删除空格(有 3/4 个空格)并将它们更改为“,”进行处理:

cat mydata.txt | tr -s " " "," | awk -F"," 'BEGIN { X = NF } { for (i = 0; i <= X; i = i + 1) if($1 < 0.6 && $2<0.4) print $0}'

【讨论】:

  • @JamesBrown:是的,我正在检查他粘贴的数据,所以必须使其保持一致,谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 2020-01-31
  • 1970-01-01
  • 2016-01-06
  • 2017-12-10
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多