2015-06-17 27 views
-2

我有一條線,看起來像:刪除高達一行

foo cat dog =  -48.34277635 foo(horse->0) =  -60.34277635 

,我只希望最後一組數字:

-60.34277635 

線進行格式化,準確的間距。我到處尋找一個更簡單的解決方案,但是如果沒有一件一件地切割文件,我就找不到任何東西,直到我把它歸結爲我想要的東西。我必須做的唯一方法是非常低效,並想知道是否還有其他方法可以做到這一點。通常情況下,我會使用sed來獲取特定的字符/單詞,並從那裏刪除。隨着字符串重複的次數的增加,我不能輕易地做到這一點。

數字的長度也可以改變,但只有最後的小數。

如果可能,在Perl或Bash/Shell中的幫助將是最好的。

+1

顯示您想要的樣本輸入輸出。 – Cyrus

+0

-60.34277635 @Cyrus – MadisonCooper

回答

1

試試這個:

grep -oE '[0-9.-]+$' file 

awk '{print $NF}' file 
+0

完美。謝謝。我得到了-oE部分,但你介意解釋其餘部分嗎? – MadisonCooper

+0

'[0-9 .-] + $'是一個正則表達式,用於描述行的最後部分。 '[...]'列出允許的字符(0到9,一個點和一個減號)。加號表示前一個字符必須至少出現一次。這是''[']''中允許的字符列表中前一個字符的一個字符。 '$'表示行結束。 – Cyrus

2

如果你的意思是你只想在每行的最後一個字段,那麼你可以在Perl

open my $fh, '<', 'myfile' or die $!; 
my @data; 
push @data, (split)[-1] while <$fh>; 
+0

Perl,對吧?我忘了你可以做(​​拆分)[ - 1]。謝謝。 – MadisonCooper

+0

是的,Perl。對不起,我應該說 – Borodin

+0

沒關係。看起來很熟悉。想檢查。 – MadisonCooper

0

寫這個用awk並指定字段8(假定格式不變),這裏是我得到的:

$ cat testfile 
foo cat dog =  -48.34277635 foo(horse->0) =  -60.34277635 
$ awk '{print $8}' < testfile 
-60.34277635 
0

BASH內建的方法:

#!/bin/bash 

line='foo cat dog =  -48.34277635 foo(horse->0) =  -60.34277635' 
echo "${line##* }" 

輸出:

-60.34277635 
+0

這是爲什麼?第二個#代表數字的第二個實例嗎? – MadisonCooper

+0

@jcklasseter:'##'表示*從變量內容的開頭刪除最大可能的匹配字符串*和'*'表示*匹配任何東西直到空格*。 [來源](http://mywiki.wooledge.org/BashFAQ/100)。 –

0

的awk -F '分隔符' '{$打印NF}' - 如果你需要的最後一列

awk -F'delimiter''{print $ index}' - 如果你需要索引一個特定的列。請不要在這裏索引以1開頭