在文件开头

时间:2017-04-14 22:03:44

标签: bash unix awk sed

我在同一个子目录中有许多文件,如下所示:

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

添加第一行,但我是否必须为每个要添加的其他行输入此命令?

8 个答案:

答案 0 :(得分:6)

尝试

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

file.in是您提到的输入文件,file.out是所需输出文件的名称。

或者,甚至更短(感谢@ william-pursell):

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

答案 1 :(得分:6)

如果您有gnu awk,那么您可以在awk中使用inplace编辑,并通过读取第1条记录中的现有值来避免硬编码结束编号:

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

*.txt更改为与您的文件匹配的其他全局。

答案 2 :(得分:4)

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

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

这相当于

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

它使用bash的大括号扩展。

答案 3 :(得分: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行vs 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

答案 4 :(得分:2)

您可以通过在sed命令后面添加反斜杠来插入多行i

sed -i '1i\
1\
2\
3\
4\
5\
6\
7\
8\
9\
' file

答案 5 :(得分: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 :(得分:2)

作为替代方案,你可能会喜欢纯粹的bash:

$ 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

答案 7 :(得分:1)

这可能适合你(GNU sed):

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

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