如何在shell脚本中附加生成文件前面的行数而不生成临时文件

时间:2014-07-10 09:17:53

标签: linux bash shell unix

我有一个程序来生成这样的文件:

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

我想知道是否有一种方法可以存档而不会产生" tempfile"?我认为我的方式有些多余,希望有更好的方法。

5 个答案:

答案 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[*]}" )