に入力sed
できるコマンドを探しています。これらは 2 つの別々のファイルです。filename
filename1
INPUTにfilename
は次のものがあります:
Cindy 11 22 54
Chester 48 12 84
INPUTに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
4行目以降に追加し
filename
、空白行を削除するには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
...その後、両方の名前付き入力ファイルのすべての入力行に、長さがヌルのファイル名を持つeadファイルsed
を追加しようとしますが、失敗します。r
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 コマンドが実行されます。スクリプトで指定されている存在しないead ファイルについてエラーを報告せず、ead を試行したときに何も起こらなかったかのように続行するように仕様化されているsed
ため、失敗に気付くことはありません。sed
r
r
そしてそれは見た目cat
2つのファイルを結合するために、あるファイルを別のファイルの末尾に追加したいだけなので、これは機能するようです。これsed
は、2つの入力ファイルに名前が付けられている場合、デフォルトで実行されます。つまり、最初のファイルを読み込み、次に次のファイルを読み込みます。しかし、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
そのうちの 1 つは次のとおりです。
sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1
...実質的にはどの にも機能するはずですsed
。
または、POSIX を使用している場合sed
:
{ sed /match/q; cat file2 -; } < file1
...これははるかに効率的であるはずです。
どちらの方法でも、file2
は、 inr
の最初の発生直後にのみ一度だけ読み出されます。match
file1
。
別の方法としては次のようになります。
cat file2 | sed /match/r\ /dev/fd/0 file1
...これは、最初の一致に続くすべての一致の後に、長さが null のファイルを読み取ります...