如何只打印第 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")。因此,您想要的记录将被视为具有四个字段(1st
2nd
3rd
4th
),而其他人将有三个(1st
2nd
3rd
).如果没有指定 awk "action",则默认操作是打印当前行。
由于您在 Python 中提出了解决方案,这里有一个。它读取文件的每一行,然后将其拆分为空白处的列;如果第四列(索引 3)之后的列为空,则不会打印。
with open(filename, 'r') as f:
for line in f:
if line.split()[3:]:
print line
您可能会发现 csv
module 在处理分栏文件时更加稳健,但对于所述问题来说有点矫枉过正,并且不会保留输入的格式。
如果这是 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")。因此,您想要的记录将被视为具有四个字段(1st
2nd
3rd
4th
1st
2nd
3rd
由于您在 Python 中提出了解决方案,这里有一个。它读取文件的每一行,然后将其拆分为空白处的列;如果第四列(索引 3)之后的列为空,则不会打印。
with open(filename, 'r') as f:
for line in f:
if line.split()[3:]:
print line
您可能会发现 csv
module 在处理分栏文件时更加稳健,但对于所述问题来说有点矫枉过正,并且不会保留输入的格式。