sed を使用して別のファイルから新しい行を追加する方法

sed を使用して別のファイルから新しい行を追加する方法

に入力sedできるコマンドを探しています。これらは 2 つの別々のファイルです。filenamefilename1

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て からまでのすべての行を追加するには、次のようにします。filename1sed

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この質問に役立つ追加情報:

  • filename4行目以降に追加するには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を追加しようとしますが、失敗します。rfile1そして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書き出されたすべての行の後に、空のread コマンドが実行されます。スクリプトで指定されている存在しないead ファイルについてエラーを報告せず、ead を試行したときに何も起こらなかったかのように続行するように仕様化されているsedため、失敗に気付くことはありません。sedrr

そしてそれは見た目cat2つのファイルを結合するために、あるファイルを別のファイルの末尾に追加したいだけなので、これは機能するようです。これsedは、2つの入力ファイルに名前が付けられている場合、デフォルトで実行されます。つまり、最初のファイルを読み込み、次に次のファイルを読み込みます。しかし、readコマンドが本当に機能するのであれば、指定されたreadファイルは、入力行。

このような:

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の最初の発生直後にのみ一度だけ読み出されます。matchfile1

別の方法としては次のようになります。

cat file2 | sed /match/r\ /dev/fd/0 file1

...これは、最初の一致に続くすべての一致の後に、長さが null のファイルを読み取ります...

関連情報