2014-07-10 28 views
0

我有一個程序來生成這樣一個文件:如何追加在shell腳本生成的文件前行的數量不會產生臨時文件

./program1 $parameter > tempfile 
lineNum=`wc -l tempfile | awk '{print $1}'` 
echo $lineNum > myfile 
cat tempfile >> myfile 
rm -f tempfile 

我不知道是否有辦法歸檔這個沒有產生一個「臨時文件」?我認爲我的方式有點多餘,希望有更好的辦法。

+0

'WC -l <​​file'只給出數。 – fedorqui

+0

一般來說,沒有辦法將數據前置到文件 - 它涉及重寫整個文件。因此,這些選項要麼使用臨時文件,要麼在重寫它之前將整個文件加載到內存中。如果文件很大,那麼臨時文件是一個更好的選擇(儘管如果文件真的很大,或者如果文件系統空間不足,那麼也存在潛在的問題)。 – twalberg

回答

1

這不是真的使用臨時(如sed -i會爲你做它),但是...

#!/bin/bash 
count=$(./program1 $parameter | tee outputfile | wc -l) 
sed -i 1i${count} outputfile 

這可能不需要到的優勢將整個文件加載到內存中。根據您的數據文件,這可能會或可能不會成爲問題。

+0

是的。操作系統中必須有一個臨時文件。我只是想要一種方式,以便命令能爲我做到這一點。 –

1

您可以使用此,

sed -i "1i$(wc -l myfile | cut -d' ' -f1)" myfile 

(OR)

sed -i "1i$(wc -l < myfile)" myfile 

例:

./program1 $parameter > myfile 
sed -i "1i$(wc -l myfile | cut -d' ' -f1)" myfile 
0

你可以用awk

./program1 "$parameter" | awk '{lines[++n]=$0}END{print n;for(i=1;i<=n;++i)print lines[i]}' > myfile 

實施例:

seq --format='Inline Text %.0f' 1 10 | awk '{lines[++n]=$0}END{print n;for(i=1;i<=n;++i)print lines[i]}' 

輸出:

10 
Inline Text 1 
Inline Text 2 
Inline Text 3 
Inline Text 4 
Inline Text 5 
Inline Text 6 
Inline Text 7 
Inline Text 8 
Inline Text 9 
Inline Text 10 
1

其他解決辦法:用nl。這是一個專爲此而設計的工具。

./program1 $parameter | nl -w1 > myfile

這裏,-w1用於指定行號是由1片

輸出分開:

1 something 
2 somethingelse 
3 
4 and now for something completly different 

如果你不想使用標籤作爲分隔符,使用標誌-s"X",其中X是您想要的分隔符(1個空格,2個空格,一個字母,...)。 ./program1 $parameter | nl -w1 -s" " > myfile將產生:

1 something 
2 somethingelse 
3 
4 and now for something completly different 
+1

這完全不是OP所要求的。期望的輸出似乎是包含其餘行的計數的單行,後面是原始文件 - 不是一個正在運行的行號... – twalberg

+0

這不是我問的。 –

0

的樂趣 - 並假設您的文件足夠小,以不超過可用的內存 - 你可以只使用bash的內部爲該任務:

#!/bin/bash 

# ... 

./program1 $parameter | 
    (mapfile arr; echo ${#arr[@]}; IFS=""; echo -n "${arr[*]}") 
相關問題