2015-05-19 92 views
0

我絕對是新來的bash腳本,但我需要執行一些任務。我有一個只有一列數字的文件(6250000)。我需要一次提取100個,將它們放入一個新文件並將每個100提交給另一個程序。我認爲這應該是一種循環,通過我的文件每100個數字並提交給程序。如何從文本文件中一次提取100個數字?

假設我在文件中的數字看起來像這樣。

1.6435 
-1.2903 
1.1782 
-0.7192 
-0.4098 
-1.7354 
-0.4194 
0.2427 
0.2852 

我需要將這些62500輸出文件中的每一個輸入到具有參數文件的程序中。我在做這樣的事情:

lossopt() 
{ 
cat<<END>temp.par 
Parameters for LOSSOPT 
*********************** 

START OF PARAMETERS: 
lossin.out       \Input file with distribution 
1          \column number 
lossopt.out        \Output file 
-3.0 3.0 0.01      \xmin, xmax, xinc 
-3.0 1 
0.0 0.0 
0.0 0.0 
3.0 0.12 

END 
} 
for i in {1..62500} 
do 
sed -n 1,100p ./rearnum.out > ./lossin.out 
echo temp.par | ./lossopt >> lossopt.out 
rm lossin.out 
cut -d " " -f 101- rearnum.out > rearnum.out 
done 

rearnum是我的大初始文件

+0

如果你是新手bash scripting_但需要用it_執行一些任務,也許你花時間學習Python/Perl? Bash對於一行(例如)是罰款(超過)。,其中一個標準輸出通過管道連接到下一個標準輸入的命令列表),但對於任何嚴重的挑戰,bash將使您經歷腳本語言不需要的箍環。現在,由於您可以通過在頂部放置一個shebang('#!')或直接從bash行調用它(例如'$ python -c「print'hello world'」')來執行腳本,所以不需要投入太多時間在bash研究。 – boardrider

回答

5

如果你需要把它拆分成含100行,每行,我會使用split -l 100 <source>文件,這將創造大量的文件命名如xaa,xab,xac,...每個文件最多包含100行源文件(最後一個文件可能包含更少)。如果你想要的名字開始與比x其他東西,你可以給前綴那些名字應該split -l 100 <source> OUT作爲最後一個參數用來split作爲現在會給文件,如OUTaaOUTab,...

然後你就可以循環播放這些文件並處理它們,無論你喜歡。如果你需要與他們運行一個腳本,你可以做類似

for file in OUT*; do 
    <other_script> "$file" 
done 
+0

我需要將這些62500個輸出文件中的每一個輸入到具有參數文件的程序中。我在做這樣的事情: – Yarik

+0

lossopt(){ 貓 < temp.par 參數LOSSOPT *********************** START參數組成:與分佈 lossin.out \輸入文件 1 \列號 lossopt.out \輸出文件 -3.0 3.0 0.01 \ XMIN,XMAX,xinc -3.0 1 0.0 0.0 0.0 0.0 3.0 0.12 END } for i in {1..62500} 做 sed -n 1,100p ./rearnum.out> ./lossin.out echo temp.par | ./lossopt >> lossopt.out rm lossin.out cut -d「」-f 101- rearnum.out> rearnum.out done – Yarik

+0

恐怕我不是很清楚你想要什麼輸出文件到看起來像。你希望他們都有頭像,然後是100行數據,並通過管道將它傳遞給'。/ lossopt'。如果是這樣,我做了什麼可以很容易地使用。只需在for循環中執行'lossopt; cat $ file'並讓你的函數打印到標準輸出而不是寫入文件。當然,你可能不想/需要我的方法創建的所有臨時文件,儘管你也可以在每次迭代中刪除'$ file' –

0

你仍然可以使用一個read環路和重定向:

#!/bin/bash 

fnbase=${1:-file} 
increment=${2:-100} 

declare -i count=0 
declare -i fcount=1 

fname="$(printf "%s_%08d" "$fnbase" $((fcount)))" 

while read -r line; do 
    ((count == 0)) && :> "$fname" 
    ((count++)) 
    echo "$line" >> "$fname" 
    ((count % increment == 0)) && { 
     count=0 
     ((fcount++)) 
     fname="$(printf "%s_%08d" "$fnbase" $((fcount)))" 
    } 
done 

exit 0 

使用/輸出

這將需要yourfile與成千上萬的行和寫每100行到yourprefix_00000001 - >yourprefix_99999999(默認爲file_000000001等)。在開始寫入之前,每個新文件名都被截斷爲0行。

同樣,您可以在命令行上指定要寫入每個文件的行數。例如:

$ bash script.sh yourprefix 20 <yourfile 

這將寫入每個文件20行至yourprefix_00000001 - >yourprefix_99999999

+1

噢,我完全讀到它。我以爲他想從他的大文件中拿出第100行,然後寫入一個新文件,然後發送到他的程序。謝謝 –

0

即使它可能在bash似乎愚蠢的專業,我會冒這個險,並張貼我自己的回答我的問題

cat<<END>temp.par 
Parameters for LOSSOPT 
        *********************** 

START OF PARAMETERS: 
lossin.out       \Input file with distribution 
1          \column number 
lossopt.out        \Output file 
-3.0 3.0 0.01      \xmin, xmax, xinc 
-3.0 1 
0.0 0.0 
0.0 0.0 
3.0 0.12 

END 
for i in {1..62500} 
do 
sed -n 1,100p ./rearnum.out >> ./lossin.out 
echo temp.par | ./lossopt >> sdis.out 
rm lossin.out 
tail -n +101 rearnum.out > temp 
tail -n +1 temp > rearnum.out 
rm temp 
done 

該腳本必然會「吃掉」大的初始文件並將「塊」放入外部程序中。在佔用100個號碼的一部分之後,它從大文件中刪除這部分。然後,重複該過程直到大文件爲空。這不是一個優雅的解決方案,但它爲我工作。

相關問題