2017-04-14 134 views
3

的开始,我有一个貌似相同的子目录中的许多文件:添加多行的文件

10 A 
11 T 
12 A 
13 C 
15 A 

即两列,其中第一行总是以数字开头10

我会只需要将1-9行添加到每个文件的开头即

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 A 
11 T 
12 A 
13 C 
15 A 

我不在乎追加第二列。

我知道我可以做

sed -i '1i1' FILE 

添加第一线,但我必须键入此命令对每个附加行我要补充的吗?

回答

6

尝试

seq 1 9 | cat - file.in > file.out 

哪里file.in是你提到的输入文件,并file.out是所需的输出文件的名称。

或者更短(感谢@威廉pursell):

{ seq 1 9; cat file.in; } > file.out 
+0

您可以直接管道'seq 1 9',不需要'for'循环。 – Barmar

+0

谢谢;只是更新了我的答案。 – thiagowfx

+0

此外,它似乎是不必要的额外io管道的数据猫:'{seq 1 9; cat file.in; }> file.out'工作正常(如果你有seq;如果不是坚持使用for循环) –

1

您可以通过将反斜杠i命令后插入多行与sed

sed -i '1i\ 
1\ 
2\ 
3\ 
4\ 
5\ 
6\ 
7\ 
8\ 
9\ 
' file 
2
sed -i -e '1!b;'"$(printf 'i%d\n' {1..9})" 

这相当于跑步

sed -i -e '1!b;i1 
i2 
i3 
i4 
i5 
i6 
i7 
i8 
i9 
' 

,但更容易编写。 1!b跳过除第一行以外的其他命令,但您也可以使用1地址。

sed -i -e "$(printf '1i%d\n' {1..9})" 
6

如果你有GNU AWK那么你可以使用inplace编辑在AWK,避免硬编码结束号码从1号记录读取现有的值:

awk -i inplace 'FNR==1{for (i=1; i<$1; i++) print i} 1' *.txt 

变化*.txt其他一些水珠匹配您的文件。

2

作为替代,你可能会喜欢纯庆典:

$ cat file4 
10 A 
11 T 
12 A 
13 C 
15 A 
$ printf '%s\n%s\n' {1..9} "$(<file4)" 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 A 
11 T 
12 A 
13 C 
15 A 

要替换原文件的内容,你可以不喜欢它:

printf '%s\n%s\n' {1..9} "$(<file4)" >file44 && mv -f file44 file4 

而且sed -i这是它在后台(检查sed联机帮助页)

对于多个文件,您可以使用循环:

for f in *;do printf '%s\n%s\n' {1..9} $(<"$f") >tmp"$f" && mv tmp"$f" "$f";done 
4

这可能是您可以使用的最短的一个班轮。

sed -i -e1i{1..9} *.txt 

这相当于

sed -i -e1i1 -e1i2 -e1i3 -e1i4 -e1i5 -e1i6 -e1i7 -e1i8 -e1i9 *.txt 

它使用bash的括号扩展。

3

您可以使用Unix/POSIX/Linux cat实用程序连接并打印文件。

您可以使用<(seq 5)作为替换文件来创建开始序列。所以,你可以这样做:

$ cat <(seq 5) file 
1 
2 
3 
4 
5 
10 A 
11 T 
12 A 
13 C 
15 A 

然后,如果你想在现场编辑的效果,你可以这样做:

$ cat <(seq 5) file > tmp && mv tmp file 

然后:

$ cat file 
1 
2 
3 
4 
5 
10 A 
11 T 
12 A 
13 C 
15 A 

如果你不”没有seq你可以做:

$ cat <(echo {1..5} | tr ' ' '\n') file 

改为。 (在你的例子使用5线比9明显如何改变这种状况...。)

如果你有很多的文件,或者你想真正创建第二列,你可能要创建一个头字符串:

$ header=$(for ((x=1; x<=5; x++)); do printf "%s #\n" $x; done) 
$ echo "$header" 
1 # 
2 # 
3 # 
4 # 
5 # 

然后你就可以使用,而不是运行seq或者一些字符串:

$ cat <(echo "$header") file 
1 # 
2 # 
3 # 
4 # 
5 # 
10 A 
11 T 
12 A 
13 C 
15 A 
1

这可能会为你工作(GNU SED):

sed -i '1e seq 9' file1 file2 file3 ... 

在每个文件的第一行评估命令seq 9