我正在嘗試找到該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
....這將在第一場比賽後的每場比賽後讀取一個空長度檔...