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

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

に入れるsedようにコマンドを見つけようとします。これは2つの別々のファイルです。filenamefilename1

入力は次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

明確にする必要がある場合は、お知らせください。デフォルトでは、CindyとChesterはDoraとJeffreyの間のどこかになければなりません。

答え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

  • filename4行目の後に空のすべての行を追加および削除するには、次のようにします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

...その後、名前付き入力ファイルの各入力行にNULL長ファイル名の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コマンドがsed実行されると、これが発生します。sed仕様は、rスクリプトで指定されている存在しないeadファイルについて文句を言いませんが、rファイルを読み取ろうとしたときに何も起こらなかったかのように続くので、これらの失敗は不明です。

たぶんそうかもそうだあるファイルを別のファイルの末尾に追加したいので、これはうまくいくようです。cat両方のファイルをリンクします。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中:

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

...これは、最初のゲームの後に各ゲームの後に空の長さのファイルを読みます...

関連情報