我正在尝试找到该sed
命令,以便我可以将filename
其放入filename1
.这是我的两个单独的文件。
输入filename
有:
Cindy 11 22 54
Chester 48 12 84
输入filename1
有:
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
这是我需要的结果(输出):
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Cindy 11 22 54
Chester 48 12 84
Jefferry 84 98 90
如果我需要澄清任何事情,请告诉我。基本上,辛迪和切斯特必须介于朵拉和杰弗里之间。
答案1
要使用命令添加从filename
到 的所有行,您可以执行以下操作:filename1
sed
sed r filename1 filename
但请注意,结果将与您问题中的输出略有不同,即:
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
Cindy 11 22 54
Chester 48 12 84
编辑
sed
对于这个问题有用的一些附加信息:
filename
在第 4 行之后添加filename1
:sed '4 r filename' filename1
要在以下行中添加
filename
以“Dora”开头的行filename1
:sed '/^Dora/ r filename' filename1
filename
要在第 4 行之后添加并从中删除所有空白行filename1
:sed '/^$/d;4 r filename' filename1
答案2
如果我没记错的话不应该有任何顺序。
在这种情况下:
$ cat file2 file1 | column -t
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
Cindy 11 22 54
Chester 48 12 84
答案3
如果你这样做:
sed r file1 file2
...然后sed
将尝试将r
具有空长度文件名的 ead 文件附加到其命名输入文件的每个输入行,但失败file1
和file2
。该命令本质上与以下命令没有什么不同:
sed '' file1 file2
...除了速度r
较慢之外。
这就是我的意思:
seq 1 5 > file1
seq 6 10 > file2
strace sed r file[12]
...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...
查看open("" ...)
失败的情况ENOENT
遵循写出的每一行?这就是空r
ead 命令sed
运行的情况。您不会注意到这些失败,因为sed
规范不会抱怨r
其脚本中指定的不存在的 ead 文件,而是在尝试r
读取文件时继续执行,就好像什么也没发生一样。
也许它看起来就像它的工作原理一样,因为您只想将一个文件附加到另一个文件的末尾 - 连接cat
两个文件 -sed
默认情况下,当两个输入文件被命名时 - 它读取第一个文件,然后读取下一个文件。但如果r
ead 命令确实有效,那么命名的r
ead 文件将完全附加到每一个输入中的行。
像这样:
seq 3 > file
printf %s\\n a b c |
sed r\ file
a
1
2
3
b
1
2
3
c
1
2
3
要将一个文件的内容附加到另一个文件,您可以执行以下操作:
cat < file2 >> file1
要仅在输入中的某个点之后附加,您有一些选择。sed
其中:
sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1
...几乎可以与任何sed
.
或者如果你有 POSIX sed
:
{ sed /match/q; cat file2 -; } < file1
...这应该更有效率。
两种方法都确保内容file2
只读r
出一次,并且只在第一次出现match
in之后立即读出file1
。
另一种方式可能如下所示:
cat file2 | sed /match/r\ /dev/fd/0 file1
...这将在第一场比赛之后的每场比赛后读取一个空长度文件...