2017-07-26 160 views
3

我需要如何提取线的特定字符串一些帮助之前提取的字符。怎样的模式

我有这样的数千行的文件:

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 

获得第1列,但我不知道如何得到最后一个项目,因为它总是在不同的列。

我尝试添加了#,然后自顾自地XX字符#之前

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

其中,输出的样子: LES; Sulfolobaceae; Sulfolobus# ; Thermoproteaceae; Caldivirga# les; Haloferacaceae;沃# Haloferacaceae; Haloquadratum# ales; Natrialbaceae; Natrialba#

但后来我不得不重复该过程,并删除;直到我只剩最后一件东西。

我搜索,看看是否有任何的grep或awk的选项要做到这一点,提取1日和最后一列或提取连接到#只是字符,但我找不到任何为我工作。

我将不胜感激如何进行的任何建议。

谢谢。

+0

你可以使用'$ NF'到得到每一行中的最后一个字段,这是你想要的吗? – CWLiu

+0

感谢$ NF不正是我想要的,但它的情况下,工作我需要的只是最后一个项目。 :) – vimac

回答

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

谢谢!它的作品完美:) – vimac

+0

@vimac看看该怎么办[当某人回答你的问题](https://stackoverflow.com/help/someone-answers) – Sundeep

1

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

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

不错。虽然'sub'可能就够了。 –

+0

感谢您的编辑@ RavinderSingh13。现在好多了。 – CWLiu

+1

如果你打算在整条线上使用sub,不妨使用'sed's /;.*;/;/''...;) – Sundeep

0

你可以试试下面的Perl一个衬垫

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

-a自动拆分模式

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

,并存储在@F阵列的splited数据

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

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

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

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