如何在特定条件下从文件中提取行

1 sed awk

文件:

chromosome  position  ref  alt 
chr1          1398     A    T 
chr1          2980     A    C 
chr2          3323     C    T,A
chr2          3749     T    G
chr3          5251     C    T,G
chr3          9990     G    C,T
chr4          10345    T    G 
Run Code Online (Sandbox Code Playgroud)

当第 4 列有 2 个或更多字符以逗号分隔时,我需要提取整行

预期输出为:

chr2          3323     C    T,A
chr3          5251     C    T,G
chr3          9990     G    C,T 
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 5

看待这个问题的其他几种方式。

方法#1

由于您只对由逗号分隔的 2 个以上字符的行感兴趣,因此您可以只grep使用逗号:

$ grep "," sample.txt 
chr2          3323     C    T,A
chr3          5251     C    T,G
chr3          9990     G    C,T
Run Code Online (Sandbox Code Playgroud)

方法#2

您可以使用grep's PCRE 工具。这是grep可以使用 Perl 的正则表达式引擎进行匹配的地方。它非常强大,可以让您从grep.

松散定义

$ grep -P "(\w,)+" sample.txt 
Run Code Online (Sandbox Code Playgroud)

严格定义

$ grep -P '\w+\d\s+\d+\s+\w\s+(\w,)+' sample.txt 
Run Code Online (Sandbox Code Playgroud)

方法#3

使用awk. 这再次利用了这样一个事实,即只有带逗号 ( ,) 的行才有意义,因此它只是找到它们并打印它们:

松散定义

$ awk '/,/{print}' sample.txt 
Run Code Online (Sandbox Code Playgroud)

更严格的定义

$ awk '/([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt 
Run Code Online (Sandbox Code Playgroud)

更严格的定义

$ awk '$4 ~ /([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt
Run Code Online (Sandbox Code Playgroud)

这个查看第 4 列的内容并检查它是一个字母后跟一个逗号,后跟另一个字母。

更严格的定义

$ awk '$4 ~ /([GATC])+,[GATC]/{print}' sample.txt 
Run Code Online (Sandbox Code Playgroud)

这仅查找 G、A、T 或 C 后跟逗号,后跟另一个 G、A、T 或 C。