在其他操作之后,我基本上是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
将仅包含第一行和第三行。
答案 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 -