2017-07-26 162 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#