从 csv 文件中删除需要匹配的超过 10 个模式的不需要的行

从 csv 文件中删除需要匹配的超过 10 个模式的不需要的行

我有一个CSV文件,其中包含 2 个值columns,并且我必须match在两列中的一行中设置值,如果它符合条件,我们必须保留该列,delete否则整行。下面是我的 csv 文件的示例:

lidocaine (oint, patch) generic 1   tube of cream
lidocaine (oint, patch) generic 1   kit
lidocaine (oint, patch) generic 1   bottle of topical solution
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   jar of ointment
lidocaine (oint, patch) generic 1   bottle of lotion
lidocaine hcl (gel 2%, soln 4%) generic 1   patch

这里,除了第 4、5、6 行之外,其他行都将被删除。原因是:

  1. 第一行有左边有斑点和斑点右边是奶油所以它将被删除。

    同样,第二行和第三行也将被删除。

  2. 第四、第五和第六行将不会被删除,因为它们有左边是右边有类似的单词 oapment。

那么如何实现这一点,programatically因为在删除一行之前我有超过 10 个类似的条件需要匹配。

如果有人能帮助我,请帮忙。谢谢 :)

答案1

哎呀!晚了几年,抱歉。为了完整起见,我将添加与 bash 相关的答案。

如果你不介意弄脏双手常用表达,grep 可以成为你的朋友:

$ cat test.csv | grep -Es 'oint.*oint'                                                                     
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   jar of ointment

这里仅选择中间有“oint”且再次有“oint”的行。

您可以使用正则表达式的“或”运算符|并添加其他条件,例如,让单词“gel”后跟x%,即xa从1到20的数字:

$ cat test.csv | grep -Es 'oint.*oint|gel (20|1[0-9]|[1-9])%'
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   jar of ointment
lidocaine hcl (gel 2%, soln 4%) generic 1   patch

答案2

我可以想出这个 Python 脚本,它将文件名作为命令行参数并输出全部内容,但不输出所有列oint中没有字符串(不区分大小写)的所有行。

#! /usr/bin/env python3
import sys

COLUMN_SEPARATOR = "   "  # character or string used as column separator. Tab = "\t"
SEARCH_STRING = "oint".lower()  # case-insensitive string that needs to be present in all columns

with open (sys.argv[1]) as f:
  rows=[list(map(str.strip, line.split(COLUMN_SEPARATOR))) for line in f.readlines()]
  for r in rows:
    if all([SEARCH_STRING in r[i].lower() for i in range(len(r))]):
      print(COLUMN_SEPARATOR.join(r))

复制上述脚本并将其保存为任意文件,例如csvfilter.py
使用使其可执行chmod +x csvfilter.py

然后使用要处理的文件作为单个参数运行它。
示例输出与上面的示例相同(列由 3 个空格分隔),如下所示source.csv

$ ./csvfilter.py source.csv
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   jar of ointment

该脚本不会修改原始文件,而只是将新版本打印到标准输出。此外,除设置为的字符串之外,列之间的任何空格字符都COLUMN_SEPARATOR将被丢弃。

要用修改后的版本替换原始文件,请将输出重定向回原始文件:

$ ./csvfilter.py source.csv > source.csv

您还可以将修改后的版本保存为文件:

$ ./csvfilter.py source.csv > modified.csv

相关内容