如何仅打印第4列中具有值的行?

时间:2015-01-12 06:23:44

标签: python unix

如果有人问过/回答,我道歉;我无法通过搜索找到答案。

我有一个很长的文本文件,只有一小部分行在第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)。

3 个答案:

答案 0 :(得分:2)

由于您尚未发布数据文件样本,我将为您提供一个如何使用awk实现特定列提取的通用示例...您可以使用gawk(gnu-awk)作为

好吧,概念类似,假设您有一个文件(BBS列表),

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 '$1 == "foo" { print $2 }' BBS-list

但由于他们是fooey,macfoo,sabafoo等等你不会得到任何输出。

这是模式匹配,而不是" foo"你可以使用,模式匹配/ foo /

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

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

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

示例礼貌(犹他大学)

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

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

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

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

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

答案 1 :(得分:0)

只需使用 awk 即可打印包含四个字段的行:

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

默认情况下, awk 会忽略前导和尾随空白(在常见的语言环境中,这意味着“空格和制表符”)。因此,您所需的记录将被视为包含四个字段(1st < tab> 2nd < tab> 3rd < tab> 4th < tab> ),而其他人将有三个(1st < tab> 2nd <标签> 3rd <标签><标签> )。如果未指定 awk “action”,则默认操作是打印当前行。

答案 2 :(得分:0)

因为您要求使用Python的解决方案,所以这是一个。它读取文件的每一行,然后将其拆分为空白的列;如果第四个(索引3)之后的列为空,则不会打印。

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

在使用列式文件时,您可能会发现csv module更加健壮,但对于所述问题而言,这有点过分,并且不会保留输入的格式。