删除字段值小于或等于3的行-sed或awk?


17

我需要删除第8个字段(列)中值等于或小于2的每一行。

我的数据如下所示:

12-31   Airport 189 379 41  49.70946503 -124.91377258   2   2880    30.8
01-01   AlberniElementary   165 331 16  49.26100922 -124.80662537   4   5760    26.1
01-09   BamfieldMarine  161 323 23  48.83490372 -125.13572693   2   2875    27.4
01-10   BamfieldMarine  161 323 23  48.83490372 -125.13572693   3   3068    38.6

我知道使用awk可以剥离所需的值并将它们打印到另一个文件,并且我知道sed可以编辑当前文件。无论哪种情况,我都需要保留原始文件。

注意:请提供您的解决方案的详尽说明。仅编写命令是不够的,请注释建议。

进一步说明:数据具有标题行,因此最可能的解决方案将需要

awk'FNR> 1'

我想?

Answers:


19

差不多了

 awk '(NR>1) && ($8 > 2 ) ' foo > bar

哪里

  • NR 是记录数(即行数)
  • $8 是八场
  • && 是合乎逻辑的
  • foo 是原始文件,未更改
  • bar 结果文件
  • 隐式默认操作是打印当前输入行

请注意,标头从foo到bar被条带化,以保持标题

 awk '(NR==1) || ($8 > 2 ) ' foo > bar

哪里

  • || 是合乎逻辑的
  • 如果NR == 1或$ 8> 2将打印输入行

更新#1

指定范围

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 第八场从-4到4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) 相同,包括标题

好的答案:简单而彻底,谢谢。只是我很清楚,在这种情况下FNR和NR之间的区别不算什么,对吗?我已经阅读了手册页,其中解释了:当前记录的NR序号和当前文件中当前记录的FNR序号。因此,我认为在这种情况下,这些条件是相同的,我认为:)
地理信息技术网

如果您有一个文件,则FNR始终为NR,如果file1有10行,则file2的第一行将具有NR = 11和FNR = 1
Archemar 2015年

嗨,我想做类似的事情,但要接受介于-4到4之间的所有内容。我将如何去做,因为这是我目前可以想到的唯一方法awk'(NR == 1)|| ($ 8 = [-4-4])'foo> bar
Giles 16'7

1
awk不了解数学样式范围,请参阅我的编辑。
Archemar '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.