에 sed
넣을 수 있도록 명령을 찾으려고 합니다 . 이것은 내 두 개의 별도 파일입니다.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
명확히 해야 할 사항이 있으면 알려주세요. 기본적으로 Cindy와 Chester는 Dora와 Jefferry 사이에 있어야 합니다.
답변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
네 번째 줄 뒤에 추가하려면 다음을 수행하십시오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
추가하려고 시도하지만 실패합니다.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 명령이 sed
실행됩니다. 스크립트에 이름이 지정된 sed
존재하지 않는 ead 파일에 대해 불평하는 것이 아니라 ead를 r
시도할 때 아무 일도 일어나지 않은 것처럼 계속하도록 사양이 지정되어 있기 때문에 실패를 눈치채지 못합니다 .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
.file1
.
또 다른 방법은 다음과 같습니다.
cat file2 | sed /match/r\ /dev/fd/0 file1
...첫 번째 일치 이후의 모든 일치 후에 널 길이 파일을 읽습니다...