2012-11-10 28 views
-3

我有一個這樣的文件。我使用Ubuntu和終端。如何刪除字符串並使用它前面的數字

1345345 dfgdfg 
1345 dfgdfg 
13445 dfgdfg 
1345345 ddfg 
15345 df 
145 dfgdfg 
45 dfgdfg 
15 dfgdfg 

我想通過

1345345 *3 or /3 result = 
1345 *3 or /3 
13445 *3 or /3 
1345345 *3 or /3 
15345 *3 or /3 
145 *3 or /3 
45 *3 or /3 
15 *3 or /3 

附近創建一個腳本,我,我可以刪除字符串,並把數或乘這樣的數量和打印結果,這是與50文件或更多的條目,然後將其輸出到一個新的文本文件 所有這些我都使他們在Ubuntu上。 感謝

+1

你能告訴我們你到目前爲止嘗試過的代碼嗎? –

+0

您可以逐行讀取輸入文件,然後使用正則表達式提取數字,然後使用該數字打印執行的計算。 – arkascha

+0

我已經創建了關於導出所有這些的腳本,但我不知道如何刪除字符串。如果我無法創建或思考,應該顯示哪些代碼? – user1577708

回答

1

一個非常基本的例子是這樣的:

cat input | sed -r 's/ *([0-9]+).*/\1/' | xargs perl -e 'for($c=0;$c<=$#ARGV;$c++) {print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");}' 

(輸入是包含數據的文件)

給出:

1345345: 4036035 
1345: 4035 
13445: 40335 
1345345: 4036035 
15345: 46035 
145: 435 
45: 135 
15: 45 

你需要爲了實現您的完整目的,更多地充實它,但這應該是有趣的一部分

那我們來分解一下吧。

  1. 我們pipe(使用|)我們的輸入文件的內容爲sedregular expression只提取第一個數字,而忽略其他一切:cat input | sed -r 's/ *([0-9]+).*/\1/'

    • 它需要的任何數字,它可以找到後任何或沒有空格*(因爲該示例有幾個我複製時)
    • ([0-9]+)
    • 這可能跟別的.*
    • ,並取代了完整的字符串其發現那是s/input/replace/結構是怎麼樣

    這會降落在你得到下面的結果:

    1345345 1345 13445 1345345 15345 145 45 15

  2. 您希望對此數據執行操作:爲此,您需要使用一些通用的編程語言,如python,perl,ruby o任何其他適合您需要的東西。 (有些東西你的shell會做得很好你),我這裏使用的perl的這相生我們| xargs perl -e 'for($c=0;$c<=$#ARGV;$c++) {print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");}'

    • 所以我們再次管道的數據,我們的下一個命令|
    • 從以前的管道輸出發送到另一個程序作爲我們使用的參數xargs,就像在你的循環程序的下一步(for($c=0;$c<=$#ARGV;$c++) { ... },通過提供的命令行參數,執行你的動作(這裏我們執行* 3),然後將結果打印出來一樣簡單,只需在命令前加上
    • print ($ARGV[$c] . ": " . $ARGV[$c] * 3 . "\n");)。
  3. 一旦你有你的數據,它redirect到一個新的文件,還沒有在這裏完成

或者你也可以使用grep或許多其他程序,這是* nix中的美,它有很多工具。然而,您正在尋找的基本概念是filtering您的數據,對其進行處理並再次將其吐出。

+1

哇! 'sed | perl'!爲什麼不只是簡單地使用perl? –

+0

爲什麼不使用c呢?這主要是爲了展示如何管道和交互,它並不是一個完整的,也不是一個高性能的例子。取決於特定人員的實力,像這樣的編程鏈實際上可能是優選的或更容易的。它還允許您創建一些構建塊程序以便稍後重新使用。 (unix方式) –

+0

貓發現無用! 'cat文件| sed'...''這太可怕了! –

0

使用:(在這個例子中,我不期待數字和字符串之間有一個空格)

perl -lne 's/\W//; print "$_ x 3 = ", $_ * 3' file.txt | tee newfile.txt 

使用

awk '{print $1 " x 3 = " $1 * 3}' file.txt | tee newfile.txt 

只有使用:

while read n x; do echo "$n x 3 = $((n * 3))"; done < file.txt | tee newfile.txt 
相關問題