【问题标题】:how to delete few rows of data from a text file using shell scripting based on some conditions如何根据某些条件使用 shell 脚本从文本文件中删除几行数据
【发布时间】:2021-07-18 13:28:17
【问题描述】:

我有一个超过 100k 行的文本文件。下面提到的数据是我拥有的文本文件的示例。我想对这些数据使用一些条件并删除一些行。文本文件没有标题(ID、NAME、Code-1、code、2-code-3)。我提过供参考。如何使用 shell 脚本实现这一点?

输入测试文件:

| ID | NAME | Code-1 | code-2 | code-3 | 
| $$ | 5HF | 1E | N | Y | 
| $$ | 2MU | 3C | N | Y | 
| $$ | 32E | 3C | N | N | 
| AB | 3CH | 3C | N | N | 
| MK | A1M | AS | P | N | 
| $$ | Y01 | 01 | F | Y | 
| $$ | BG0 | 0G | F | N |

条件:

  1. 如果 code-2 = 'N' 且 code-1 不等于 ('3C' , '3B' , '32' , '31' , '3D' ) 那么 ID='$$'
  2. 如果 code-2 ='N' 和 code-1 等于 ('3C' , '3B' , '32' , '31' , '3D') 然后接受任何 ID 并且 (accept ID='$$ ' 仅当 code-3='Y')'
  3. 如果 code-2 != 'N' 则接受(ID='$$' only if code-3='Y')和所有其他 ID

输出:

| ID | NAME | Code-1 | code-2 | code-3 | 
| $$ | 5HF | 1E | N | Y | 
| $$ | 2MU | 3C | N | Y | 
| AB | 3CH | 3C | N | N | 
| MK | A1M | AS | P | N | 
| $$ | Y01 | 01 | F | Y |

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中以代码的形式添加您的努力,这在 SO 上受到强烈鼓励,谢谢。
  • @sunanda p - 如果文本文件没有标题,则不要通过将它们插入预先格式化的块中来误导读者。
  • 接受任何 ID 并且(仅当 code-3='Y' 时接受 ID='$$') 是矛盾的。
  • 我的意思是接受所有其他 ID 并且(仅当 code-3='Y' 时接受 ID='$$')

标签: shell unix scripting sh


【解决方案1】:

我们鼓励您在提问时展示自己的努力。但我确实理解如果您是 Bash 新手,这个问题可能会很复杂。这是我使用 awk 的解决方案。在我的计算机上花费了 0.545 秒处理了 137k 行(中等规格)。

awk '{
ID=$2; NAME=$4; CODE1=$6; CODE2=$8; CODE3=$10;
if (CODE2 == "N") {
  if (CODE1 ~ /(3C|3B|32|31|3D)/) {
    if (ID == "$$") {
      if (CODE3 == "Y") {
        print;
      }
    }
    else {
      print;
    }
  }
  else {
    if (ID == "$$") {
      print;
    }
  }
}
else {
  if (ID == "$$") {
    if (CODE3 == "Y") {
      print;
    }
  }
  else {
    print;
  }
}}' file

注意它有一定的限制:

a) 它用空格而不是| 分隔值。它适用于您的确切输入格式,但不适用于没有额外空格的输入行,例如

|$$|32E|3C|N|N|
|AB|3CH|3C|N|N| 

b) 同理,如果 col 值有多余的空格,例如

| $$ | 32E FOO | 3C | N | N |
| AB | 3CH BBT | 3C | N | N |

【讨论】:

  • 检查条件后,这段代码会删除不需要的行吗?我只是想知道我们为什么要使用 print
  • 代码打印想要的行,而不是删除不需要的行。
猜你喜欢
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多