2014-03-26 54 views
1

的結束串我得到的文件名很長的名單,並從每個文件名我想提取從後面的第4個標記標識的字符串,假定分隔符是強調這樣的:摘自線

/dir1/_GET_na_na_na.txt 
/dir1/dir2/_GET_na_na_na.txt 
/dir1/dir2/na_GET_na_na_na.txt 
/dir1/dir2/na_na_GET_na_na_na.txt 

在所有這些情況下,我想提取「下劃線GET下劃線」。我可以'basename'來擺脫隨機的dirname,但是這仍然不能解決我需要從後面「剪切-f4 -d_」的問題。

回答

2

這是AWK工作

awk -F_ 'NF > 3 {print FS $(NF-3) FS}' file.txt 
+1

你的意思是寫'打印FS $(NF-3)FS'? –

+0

當然,如果他真的想要下劃線。 – Kevin

+0

+1用於忽略域數太少的行。 – mklement0

1

髒快捷:

awk -F'_' '{NF-=3;print FS $NF FS}' file 

與您的數據:

kent$ echo " /dir1/_GET_na_na_na.txt 
    /dir1/dir2/_GET_na_na_na.txt 
    /dir1/dir2/na_GET_na_na_na.txt 
    /dir1/dir2/na_na_GET_na_na_na.txt"|awk -F'_' '{NF-=3;print FS $NF FS}' 
_GET_ 
_GET_ 
_GET_ 
_GET_ 
2

正如其他的答案,awk爲基礎的解決方案給可能是最快/最簡單的。但是,因爲您標記這只是,這裏有一個唯一的bash回答:

$ while IFS=_ read -a line; do echo "_${line[@]: -4:1}_"; done < file.txt 
_GET_ 
_GET_ 
_GET_ 
_GET_ 
$ 

只需閱讀每一行到一個數組,分割上_。然後輸出最後一個數組元素的第四個。

+1

對於_readable_答案+1(以澄清:不是爲http://codegolf.stackexchange.com/指定的東西)':'' – devnull

1

這是一個在perl

$ perl -F_ -lane '$,="_"; print "",$F[-4],""' file.txt 
_GET_ 
_GET_ 
_GET_ 
_GET_