2015-10-23 39 views
1

我嘗試從表中的每FILE.DAT採取的第一個號碼獲取第一實數:從一系列文件

5.01  1  56.413481000 -0.00063400 0.00095770 
    5.01  2  61.193808800 0.00102170 0.00078280 
    5.01  3  65.974136600 -0.00108170 0.00102620 
    5.01  4  70.754464300 0.00082490 0.00103630 

,然後使用這個號碼(5.01)作爲的稱號。 PNG文件。

我使用bash腳本,我知道在這裏的問題中找到的命令line=$(head -n 1 $f),但是這需要我的文件的第一行$f

在這種情況下也行了節省空間和.png文件標題變成了:

plot 5.01 1 56.413481000 -0.00063400 0.00095770.png

有一些方法只有5.01採取並有情節的微調標題?

感謝所有。

回答

3

我可能只是做與perl

VAL=$(echo "$line" | perl -pe 's/^[^\d]+//g;s/[^\d\.].*$//') 

類似的東西反正。

應該刪除:

  • 任何不是從行的開頭數字。
  • 任何非數字或不是.到行尾。
1

或者您也可以致電避免任何額外的流程,並保持所有數據操作的bash外殼採用

while read realNum restOfLine ; 
    break 
    done < $f 

    echo $realNum 

這抓住了第一個「字」,並把剩下的爲「restOfLine」。 break確保您只能讀取文件的第一行。

IHTH

+0

有沒有辦法做到這一點,驗證是否抓住第一個「單詞」實際上是數字? (比任何事情都要求好奇)。 – Sobrique

+0

@Sobrique:使用'[[「$ realNum」=〜$ pattern]]的正則表達式測試應該適用於'$ pattern'。 –

+1

@Sobrique:是的,你可以驗證爲BenjaminW。指示case case語句中的shell glob字符(仍然沒有額外的進程;-))。或者你可以在變量的右邊添加一行'realNum = $ {realNum %% [^ 0-9。]}'並且類似。我在答案中沒有包括這一點的原因是,不清楚在輸入錯誤的情況下OP會做什麼:嘗試下一行,停止所有處理,或跳到下一個文件,並且該處理級別不是暗示在Q.祝大家好運! – shellter

2

要提取的第一個字段,假設它們是製表符分隔:

val=$(head -n 1 $f | cut -f 1) 

,或者,如果它們是空間分離的,而不是:

val=$(head -n 1 $f | cut -f 1 -d ' ') 
3

或者使用grep:

grep -o "[0-9]*\.[0-9]*" file.dat | head -1 

編輯: 測試無頭-1的ONELINE輸入:

echo " 5.01  2  61.193808800 0.00102170 0.00078280" | grep -o "[0-9]*\.[0-9]*" 
5.01 
61.193808800 
0.00102170 
0.00078280 

使用頭-1將返回在第一行的第一場比賽。

當你知道這場比賽會在第一行,所以我們可以忽略與不正確的第一行的文件(不通過完整的文件的grep): 做一個雙頭怪物:

head -1 | grep -o "[0-9]*\.[0-9]*" file.dat | head -1