【问题标题】:How to extract characters before a pattern如何提取模式前的字符
【发布时间】:2017-07-26 18:48:21
【问题描述】:

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

我有一个包含数千行的文件,如下所示:

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# 

我知道如何用

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

但我不知道如何获取最后一项,因为它总是在不同的列中。

我尝试添加 # 然后在 # 之前保留 XX 个字符

grep -E -o '.{X,X}PATTERN. fileIn > fileOut

输出如下所示: 莱斯;磺草科;硫化叶# ; Thermoproteaceae;卡迪维加# 莱斯;卤草科;卤代鱼# 卤草科;光方体# 麦芽酒; Natrialbaceae; Natrialba#

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

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

如果有任何关于如何进行的建议,我将不胜感激。

谢谢。

【问题讨论】:

  • 您可以使用$NF 获取每行的最后一个文件,这是您想要的吗?
  • 谢谢 $NF 不是我想要的,但它可以在我只需要最后一项的情况下工作。 :)

标签: regex awk grep


【解决方案1】:
$ awk 'BEGIN{FS=OFS=";"}{print $1,$NF}' file
Eukaryota; Paramecium#
Eukaryota; Embryophyta#
Bacteria; Acaryochloris#
Eukaryota; Viridiplantae# 
Bacteria; Alphaproteobacteria#

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 不错。不过,sub 可能就足够了。
  • 感谢您的编辑@RavinderSingh13。现在好多了。
  • 如果你打算只在整行上使用 sub,不妨使用sed 's/;.*;/;/'... ;)
【解决方案3】:
awk '{print $1,$NF}' file

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

【讨论】:

    【解决方案4】:

    你可以试试下面的 Perl 单行

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

    -a自动拆分模式

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

    并将分割后的数据存储在@F数组中

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多