我有一個程序來生成這樣一個文件:如何追加在shell腳本生成的文件前行的數量不會產生臨時文件
./program1 $parameter > tempfile
lineNum=`wc -l tempfile | awk '{print $1}'`
echo $lineNum > myfile
cat tempfile >> myfile
rm -f tempfile
我不知道是否有辦法歸檔這個沒有產生一個「臨時文件」?我認爲我的方式有點多餘,希望有更好的辦法。
我有一個程序來生成這樣一個文件:如何追加在shell腳本生成的文件前行的數量不會產生臨時文件
./program1 $parameter > tempfile
lineNum=`wc -l tempfile | awk '{print $1}'`
echo $lineNum > myfile
cat tempfile >> myfile
rm -f tempfile
我不知道是否有辦法歸檔這個沒有產生一個「臨時文件」?我認爲我的方式有點多餘,希望有更好的辦法。
這不是真的不使用臨時(如sed -i
會爲你做它),但是...
#!/bin/bash
count=$(./program1 $parameter | tee outputfile | wc -l)
sed -i 1i${count} outputfile
這可能不需要到的優勢將整個文件加載到內存中。根據您的數據文件,這可能會或可能不會成爲問題。
是的。操作系統中必須有一個臨時文件。我只是想要一種方式,以便命令能爲我做到這一點。 –
您可以使用此,
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
你可以用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
其他解決辦法:用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
這完全不是OP所要求的。期望的輸出似乎是包含其餘行的計數的單行,後面是原始文件 - 不是一個正在運行的行號... – twalberg
這不是我問的。 –
的樂趣 - 並假設您的文件足夠小,以不超過可用的內存 - 你可以只使用bash的內部爲該任務:
#!/bin/bash
# ...
./program1 $parameter |
(mapfile arr; echo ${#arr[@]}; IFS=""; echo -n "${arr[*]}")
'WC -l <file'只給出數。 – fedorqui
一般來說,沒有辦法將數據前置到文件 - 它涉及重寫整個文件。因此,這些選項要麼使用臨時文件,要麼在重寫它之前將整個文件加載到內存中。如果文件很大,那麼臨時文件是一個更好的選擇(儘管如果文件真的很大,或者如果文件系統空間不足,那麼也存在潛在的問題)。 – twalberg