另一种选择:cut -d <string>?

hel*_*ndy 4 bash shell parsing text cut

当我输入时ls我得到:

aedes_aegypti_upstream_dremeready_all_simpleMasked_random.fasta
anopheles_albimanus_upstream_dremeready_all_simpleMasked_random.fasta
anopheles_arabiensis_upstream_dremeready_all_simpleMasked_random.fasta
anopheles_stephensi_upstream_dremeready_all_simpleMasked_random.fasta
culex_quinquefasciatus_upstream_dremeready_all_simpleMasked_random.fasta
Run Code Online (Sandbox Code Playgroud)

我想将其通过管道传输到 cut (或通过某种替代方式),以便我只得到:

aedes_aegypti
anopheles_albimanus
anopheles_arabiensis
anopheles_stephensi
culex_quinquefasciatus
Run Code Online (Sandbox Code Playgroud)

如果 cut 接受一个字符串(多个字符)作为分隔符,那么我可以使用:

cut -d "_upstream_" -f1
Run Code Online (Sandbox Code Playgroud)

但这是不允许的,因为 cut 只采用单个字符作为分隔符。

fed*_*qui 5

awk允许使用字符串作为分隔符:

$ awk -F"_upstream_" '{print $1}' file
aedes_aegypti
anopheles_albimanus
anopheles_arabiensis
anopheles_stephensi
culex_quinquefasciatus
drosophila_melanogaster
Run Code Online (Sandbox Code Playgroud)

请注意,对于给定的输入,您还可以使用cutwith_作为分隔符并打印前两条记录:

$ cut -d'_' -f-2 file
aedes_aegypti
anopheles_albimanus
anopheles_arabiensis
anopheles_stephensi
culex_quinquefasciatus
drosophila_melanogaster
Run Code Online (Sandbox Code Playgroud)

sed并且grep也能做到。例如,这grep使用前瞻打印从行开头开始的所有内容,直到找到_upstream

$ grep -Po '^\w*(?=_upstream)' file
aedes_aegypti
anopheles_albimanus
anopheles_arabiensis
anopheles_stephensi
culex_quinquefasciatus
drosophila_melanogaster
Run Code Online (Sandbox Code Playgroud)