sed를 사용하여 다른 파일의 새 줄을 추가하는 방법

sed를 사용하여 다른 파일의 새 줄을 추가하는 방법

sed넣을 수 있도록 명령을 찾으려고 합니다 . 이것은 내 두 개의 별도 파일입니다.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

명확히 해야 할 사항이 있으면 알려주세요. 기본적으로 Cindy와 Chester는 Dora와 Jefferry 사이에 있어야 합니다.

답변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이 질문에 유용한 추가 정보는 다음과 같습니다 .

  • filename네 번째 줄 뒤에 추가하려면 다음을 수행하십시오 filename1.

    sed '4 r filename' filename1

  • filename"Dora"로 시작하는 줄 뒤에 추가하려면 다음을 수행하세요 filename1.

    sed '/^Dora/ r filename' filename1

  • 네 번째 줄 뒤에 추가 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 명령이 sed실행됩니다. 스크립트에 이름이 지정된 sed존재하지 않는 ead 파일에 대해 불평하는 것이 아니라 ead를 r시도할 때 아무 일도 일어나지 않은 것처럼 계속하도록 사양이 지정되어 있기 때문에 실패를 눈치채지 못합니다 .r

그리고 어쩌면 그럴 수도 있지외모cat두 개의 파일을 연결하기 위해 다른 파일의 끝에 파일을 추가하려고 하기 때문에 작동하는 것처럼 작동합니다. 이는 sed두 개의 입력 파일 이름이 지정되면 기본적으로 수행되며 첫 번째 파일을 읽은 다음 다음 파일을 읽습니다. 그러나 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

...이것이 훨씬 더 효율적일 것입니다.

두 가지 방법 모두file2r한 번만 읽혀지고 첫 번째 발생 직후에만 읽혀 집니다 match.file1.

또 다른 방법은 다음과 같습니다.

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

...첫 번째 일치 이후의 모든 일치 후에 널 길이 파일을 읽습니다...

관련 정보