如何只打印第 4 列有值的行?

How to print only rows that have a value in the 4th column?

如果这是 asked/answered,我深表歉意;我无法通过搜索找到答案。

我有一个很长的文本文件,只有一小部分行在第 4 列中有值,这正是我关心的。我怎样才能只打印那些行?

这是我的数据:

gi|254160123|ref|NC_012967.1|   585236  C       
gi|254160123|ref|NC_012967.1|   585237  C       
gi|254160123|ref|NC_012967.1|   585238  A       
gi|254160123|ref|NC_012967.1|   585239  C   4   
gi|254160123|ref|NC_012967.1|   585240  A       
gi|254160123|ref|NC_012967.1|   585241  A       
gi|254160123|ref|NC_012967.1|   585242  C       
gi|254160123|ref|NC_012967.1|   585243  T   16  
gi|254160123|ref|NC_012967.1|   585244  G   6   
gi|254160123|ref|NC_012967.1|   585245  C   2   
gi|254160123|ref|NC_012967.1|   585246  G   3   
gi|254160123|ref|NC_012967.1|   585247  C   9   

我只想打印第四列中有值的行(在本例中为第 4、8、9、10、11、12 行)。

由于您还没有发布数据文件的示例,我将给您一个关于如何使用 awk 提取特定列的通用示例...您可以使用 gawk(gnu-awk) 作为

嗯,概念是相似的,假设你有一个文件(BBS-list),

alpo-net     555-3412     2400/1200/300     A
bites        555-1675     2400/1200/300     A
fooey        555-1234     2400/1200/300     B
foot         555-6699     1200/300          B
macfoo       555-6480     1200/300          A
sdace        555-3430     2400/1200/300     A
sabafoo      555-2127     1200/300          C

如果你想用第一列记录打印第二列 'EXACT' 匹配 'foo'

你可以使用--

$ awk ' == "foo" { print  }' BBS-list

但由于它们是 fooey、macfoo、sabafoo 等,您不会得到任何输出。

模式匹配来了,可以用"foo"代替,模式匹配/foo/

$ awk ' ~ /foo/ { print  }' BBS-list

结果将是 fooey、foot、macfoo 和 sabafoo,

555-1234
555-6699
555-6480
555-2127

示例礼貌(犹他大学)

因此,为了隔离 NULL,您可以使用

awk '==""' myfile.txt    // means third column (as you asked)

但在对我的系统进行研究和测试后,我感到困惑的是我无法使用 awk 隔离空值。它不能区分 NULL 和 Space.The 问题是你必须特别提到分隔符。最好的方法是使用 tab 作为字段分隔符。因此你可以使用,

awk 'BEGIN {FS="\t"} =="" {print}' myfile.txt

我认为这应该可以解决您的困境。

只需使用 awk 仅打印具有四个字段的行:

awk 'NF==4' /path/to/input   # Num Fields == 4

默认情况下 awk 忽略前导和尾随空白(在常见的语言环境中,这意味着 "spaces and tabs")。因此,您想要的记录将被视为具有四个字段(1st2nd3rd4th),而其他人将有三个(1st2nd3rd).如果没有指定 awk "action",则默认操作是打印当前行。

由于您在 Python 中提出了解决方案,这里有一个。它读取文件的每一行,然后将其拆分为空白处的列;如果第四列(索引 3)之后的列为空,则不会打印。

with open(filename, 'r') as f:
    for line in f:
        if line.split()[3:]:
            print line

您可能会发现 csv module 在处理分栏文件时更加稳健,但对于所述问题来说有点矫枉过正,并且不会保留输入的格式。