如何在模式之前提取字符

时间:2017-07-26 08:18:32

标签: regex awk grep

我需要一些关于如何提取一行特定字符串的帮助。

我有一个包含数千行的文件:

Eukaryota; Alveolata; Ciliophora; Intramacronucleata; Paramecium#
Eukaryota; Viridiplantae; Streptophyta; Embryophyta#
Bacteria; Cyanobacteria; Synechococcales; Acaryochloridaceae; Acaryochloris#
Eukaryota; Viridiplantae# 
Bacteria; Proteobacteria; Alphaproteobacteria#

我想获得每一行的第一项和最后一项。所以输出将是:

Eukaryota; Paramecium#
Eukaryota; Embryophyta#
Bacteria; Acaryochloris#
Eukaryota; Viridiplantae# 
Bacteria; Alphaproteobacteria# 

我知道如何使用

获取第1列
awk '{print$1}' fileIn > fileOut

但我不知道如何获取最后一项,因为它始终位于不同的列中。

我尝试添加#,然后在#with

之前保留XX个字符
grep -E -o '.{X,X}PATTERN. fileIn > fileOut

输出如下: 莱; Sulfolobaceae;硫化# ; Thermoproteaceae; Caldivirga# 莱; Haloferacaceae;沃#  Haloferacaceae; Haloquadratum# 生啤酒; Natrialbaceae; Natrialba#

但是我必须重复这个程序并删除;直到我只剩下最后一项。

我搜索是否有任何grep或awk选项来执行此操作,提取第1列和最后一列或仅提取附加到#的字符,但我找不到任何对我有用的工作。

我很感激有关如何继续的任何建议。

感谢。

4 个答案:

答案 0 :(得分:2)

$ awk 'BEGIN{FS=OFS=";"}{print $1,$NF}' file
Eukaryota; Paramecium#
Eukaryota; Embryophyta#
Bacteria; Acaryochloris#
Eukaryota; Viridiplantae# 
Bacteria; Alphaproteobacteria#

答案 1 :(得分:1)

由于您文件中的分隔符为;,因此您还可以使用gsub(/;.*;/,";",$0)过滤掉两个;之间的字段,以获取第一个和最后一个字段。

$ awk '{gsub(/;.*;/,";")}1' fileIn > fileOut
$ cat fileOut
Eukaryota; Paramecium#
Eukaryota; Embryophyta#
Bacteria; Acaryochloris#
Eukaryota; Viridiplantae# 
Bacteria; Alphaproteobacteria#

答案 2 :(得分:1)

awk '{print $1,$NF}' file

Eukaryota; Paramecium#
Eukaryota; Embryophyta#
Bacteria; Acaryochloris#
Eukaryota; Viridiplantae#
Bacteria; Alphaproteobacteria#

答案 3 :(得分:0)

您可以尝试以下Perl one liner

perl -aF';' -ne 'print "$F[0],$F[-1]"' test.txt

-a自动拆分模式

-F';'将分隔符设置为;

分割的数据存储在@F数组

$F[0]包含第一列(第一个索引)

$F[-1]包含最后一列(最后一个索引)