的开始,我有一个貌似相同的子目录中的许多文件:添加多行的文件
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
添加第一线,但我必须键入此命令对每个附加行我要补充的吗?
的开始,我有一个貌似相同的子目录中的许多文件:添加多行的文件
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
添加第一线,但我必须键入此命令对每个附加行我要补充的吗?
尝试
seq 1 9 | cat - file.in > file.out
哪里file.in
是你提到的输入文件,并file.out
是所需的输出文件的名称。
或者更短(感谢@威廉pursell):
{ seq 1 9; cat file.in; } > file.out
您可以通过将反斜杠i
命令后插入多行与sed
。
sed -i '1i\
1\
2\
3\
4\
5\
6\
7\
8\
9\
' file
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})"
如果你有GNU AWK那么你可以使用inplace
编辑在AWK,避免硬编码结束号码从1号记录读取现有的值:
awk -i inplace 'FNR==1{for (i=1; i<$1; i++) print i} 1' *.txt
变化*.txt
其他一些水珠匹配您的文件。
作为替代,你可能会喜欢纯庆典:
$ 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
这可能是您可以使用的最短的一个班轮。
sed -i -e1i{1..9} *.txt
这相当于
sed -i -e1i1 -e1i2 -e1i3 -e1i4 -e1i5 -e1i6 -e1i7 -e1i8 -e1i9 *.txt
它使用bash
的括号扩展。
您可以使用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
这可能会为你工作(GNU SED):
sed -i '1e seq 9' file1 file2 file3 ...
在每个文件的第一行评估命令seq 9
。
您可以直接管道'seq 1 9',不需要'for'循环。 – Barmar
谢谢;只是更新了我的答案。 – thiagowfx
此外,它似乎是不必要的额外io管道的数据猫:'{seq 1 9; cat file.in; }> file.out'工作正常(如果你有seq;如果不是坚持使用for循环) –