如何在制表符分隔的管道输出的第一列上进行grep?子集?

时间:2017-10-15 18:30:49

标签: python linux grep pipe

在其他操作之后,我基本上是cat一个文件,它以制表符分隔的格式输出。

有列

$ cat file.txt 
longstring1:with:semicolons    ERFVBNMNBFGHNMKJHNMH    1:2:2:2:2    -
secondline:is:here    VHNBVFTYHNBGHJMKJHJMN    0:0:0:0:0    -
third:canbefound:here    VFTYHBVFGHJNJGVGHJKMNGB    4:1:0:1:0    -

(1)将此输出管道输入grep,我怎么能只在第一列上进行grep

$ cat file.txt | grep first_column > new_out.txt

在这种情况下,因为我grep来自cat file.txt的管道输出的第一列的每一行new_out.txt,文件file.txt应该与{{1}相同}}

(2)有没有办法使用命令行工具根据某些条件在第一列上执行grep?

我想仅在第三列包含非零元素时才grep第一列行。这是可能的,还是应该使用一些脚本语言(例如Python)?

在这种情况下,操作将类似于

$ cat file.txt | grep first_column if some_condition > new_out.txt

在这种情况下,new_out.txt将仅包含第一行和第三行。

3 个答案:

答案 0 :(得分:2)

awk救援。

案例(1),根据第一列($1)中的值进行过滤:

$ awk -F'\t' '$1~"here" {print}' file
secondline:is:here    VHNBVFTYHNBGHJMKJHJMN    0:0:0:0:0    -
third:canbefound:here    VFTYHBVFGHJNJGVGHJKMNGB    4:1:0:1:0    -

(如果第一列$1包含模式/字符串here,我们打印整行。)

情况(2),根据第一列中的值进行过滤,但前提是第三列包含至少一个非零元素:

$ awk -F'\t' '$3~/(^|:)[1-9]+(:|$)/ && $1~"here" {print}' file
third:canbefound:here    VFTYHBVFGHJNJGVGHJKMNGB    4:1:0:1:0    -

(除了前一种情况的条件之外,我们确保第三列$3包含模式:<one_or_more_digits_except_zero>:,起始冒号:在开始时被省略并且结束了价值。)

答案 1 :(得分:1)

  

仅在第三列包含的情况下grep第一列行   非零元素

awk '$3~/[1-9]/{ print $1 }' file.txt > new_out.txt

答案 2 :(得分:1)

使用 awk

$ awk ' $3!~/0:0:0:0:0/{print}' file
longstring1:with:semicolons    ERFVBNMNBFGHNMKJHNMH    1:2:2:2:2    -
third:canbefound:here    VFTYHBVFGHJNJGVGHJKMNGB    4:1:0:1:0

如果您想搜索第一栏中的任何内容,请说明一词,然后您可以将其修改为:

$ awk ' $3!~/0:0:0:0:0/ && $1~/with/{print}' file
longstring1:with:semicolons    ERFVBNMNBFGHNMKJHNMH    1:2:2:2:2    -