예
파일 1:
This Dog
This Cat
This Duck
This Horse
파일 2:
...
Animal Name
...
AniMal Type
...
AnIMal Class
...
animal Brand
...
나는 다음을 수행하고 싶습니다 :
- "Animal"(대소문자 무시)의 첫 번째 항목 아래에 파일 1(개)의 라인 1을 추가합니다.
- 두 번째로 나타나는 "Animal"(대소문자 무시) 아래에 파일 1(고양이)의 라인 2를 추가합니다.
- 세 번째로 나타나는 "Animal" 아래에 파일 1(This Duck)의 3행을 추가합니다(대소문자 무시).
- 4번째 "Animal" 항목 아래에 파일 1(말)의 4행을 추가합니다(대소문자 무시).
- ...
따라서 일반적으로 파일 1의 n번째 줄은 "Animal"의 n번째 발생(대소문자 무시) 아래에 추가되어야 합니다.
그렇다면 "sed"나 "awk" 또는 Linux의 다른 명령을 사용하여 이를 달성하는 방법은 무엇일까요?
답변1
GNU sed 사용:
$ sed '/^animal/IR File1' File2
...
Animal Name
This Dog
...
AniMal Type
This Cat
...
AnIMal Class
This Duck
...
animal Brand
This Horse
...
GNU 확장은 다음과 같습니다:
정규식 일치의 I 수정자는 정규식을 대소문자를 구분하지 않고 일치시키는 GNU 확장입니다.
그리고
R 파일 이름
현재 주기가 끝날 때나 다음 입력 줄을 읽을 때 읽을 파일 이름 줄을 출력 스트림에 대기열에 추가하고 삽입합니다. 파일 이름을 읽을 수 없거나 끝에 도달하면 줄이 추가되지 않으며 오류 표시도 나타나지 않습니다.
답변2
이것앗솔루션은 다음과 같은 작업을 수행해야 합니다.
awk 'NR==FNR{a[NR]=$0;next};1;tolower($1)=="animal"{print a[++i]}' file1 file2 > file3
NR==FNR{a[NR]=$0;다음}file1 데이터를 배열에 축적하고, 이 단계에서 file2가 처리되지 않도록 다음 입력 줄로 점프합니다.
1file2의 각 입력 줄을 인쇄합니다.
tolower($1)=="동물"{print a[++i]}대소문자를 구분하지 않고 "동물"과 일치하고 해당 배열 항목을 출력하며 배열 인덱스를 미리 증가시킵니다.
답변3
옆
file_1의 끝을 나타내기 위해 .
마지막 행 뒤에 하나를 추가하면 됩니다 . 왜냐하면 한 파일이 끝나고 다음 파일이 시작되는 시점을 아는 이러한 다양한 개념 이 IOW 없기 때문입니다 .file_1
sed
sed
FNR
awk
sed
POSIX
기본 아이디어는 동물 이름을 저장한 hold area
다음 읽을 시간이 되면 file_2
줄바꿈으로 구분된 각 부분을 가져 와서 읽는 동안 hold
추가하는 것입니다 . 이 연습은 대소문자를 구분하지 않고 리터럴 문자열을 형성하는 행에서만 작동합니다 .pattern space
detach
hold
attach<->detach
animal
sed -e '
1{
:file1
N
/\n\.$/!bfile1
s///;h;d
}
/^[aA][nN][iI][mM][aA][lL]/!b
G
s/\n/&&/2;ta
b
:a
h;s/.*\n\n//;x
s/\n\n.*//
' file_1 file_2