我在同一个子目录中有许多文件,如下所示:
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
添加第一行,但我是否必须为每个要添加的其他行输入此命令?
答案 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
。