我有一个程序来生成这样的文件:
./program1 $parameter > tempfile
lineNum=`wc -l tempfile | awk '{print $1}'`
echo $lineNum > myfile
cat tempfile >> myfile
rm -f tempfile
我想知道是否有一种方法可以存档而不会产生" tempfile"?我认为我的方式有些多余,希望有更好的方法。
答案 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
答案 1 :(得分:1)
其他解决方案:使用nl
。这是一个专门为此而设计的工具。
./program1 $parameter | nl -w1 > myfile
此处,-w1
用于指定行号由1个标签分隔
输出:
1 something
2 somethingelse
3
4 and now for something completly different
如果您不想使用tab作为分隔符,请使用标记-s"X"
,其中X是您想要的分隔符(1个空格,2个空格,一个字母,......)。 ./program1 $parameter | nl -w1 -s" " > myfile
将产生:
1 something
2 somethingelse
3
4 and now for something completly different
答案 2 :(得分:1)
这不是真的而不使用临时(因为sed -i
会为你做)但是......
#!/bin/bash
count=$(./program1 $parameter | tee outputfile | wc -l)
sed -i 1i${count} outputfile
这可能具有不需要将整个文件加载到内存中的优点。根据您的数据文件,这可能是也可能不是问题。
答案 3 :(得分: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
答案 4 :(得分:0)
为了好玩 - 并且假设您的文件足够小而不超过可用内存 - 您只能使用bash内部来完成该任务:
#!/bin/bash
# ...
./program1 $parameter |
( mapfile arr; echo ${#arr[@]}; IFS=""; echo -n "${arr[*]}" )