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

2024-04-26 18:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

如果有人问/回答了这个问题,我很抱歉;我无法通过搜索找到答案。你知道吗

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


Tags: 数据答案refnc文本文件关心gi本例
3条回答

由于您还没有发布数据文件的示例,我将给您一个关于如何使用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

示例(犹他大学)

因此,为了隔离空值

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

但是在我的系统上进行了研究和测试之后,我很困惑,我不能用awk隔离空值。它不能区分空值和空值空间。空间问题是你必须特别提到分隔符。最好的方法是使用选项卡作为字段分隔符。所以你可以用

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

我想这应该能解决你的困境。你知道吗

既然您要求用Python提供一个解决方案,那么这里有一个。它读取文件的每一行,然后将其拆分为空白列;如果第四行(索引3)后面的列为空,则不打印。你知道吗

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

在处理列式文件时,您可能会发现^{} module更健壮,但对于所述的问题来说,它有点过分,并且不保留输入的格式。你知道吗

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

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

默认情况下,awk忽略前导空格和尾随空格(在公共区域设置中,这意味着“空格和制表符”)。因此,您所需的记录将被视为具有四个字段(^{><;tab>;^{><;tab>;^{><;tab>;<;tab>;),而其他字段将具有三个字段(^{>^{><;tab>;>><;tab>;)。如果未指定“操作”,则默认操作是打印当前行。你知道吗

相关问题 更多 >