여러 파일을 병합하는 sed 명령

여러 파일을 병합하는 sed 명령

여러 파일을 하나의 파일로 병합하고 첫 번째 파일 머리글과 마지막 파일 바닥글을 제외한 모든 파일의 머리글과 바닥글을 제거하고 싶습니다.

예를 들어 10개의 파일이 있습니다.

파일 1

Name
A
B
C
Next date

파일 2

Name
D
E
F
Next date

...

문서 10

Name
X
Y
Next date

다음과 같은 출력이 필요합니다.

Name
A
B
C
D
E
F
...
X
Y
Next date

명령에 따라 무엇을 해야 합니까 sed?

답변1

head, tailsed:을 사용하십시오 .

set -- File*

{
    head -n 1 "$1"
    for file do
        sed '1d;$d' "$file"
    done
    tail -n 1 "$file"
} >outfile

이는 모든 관련 파일의 이름이 일치한다고 가정합니다 File*(또는 이를 일치시키기 위해 명령에서 사용하는 모든 패턴 set).

set명령은 위치 인수(예: 등) 를 사용하려는 파일 이름 $1으로 설정합니다. $2이러한 내용은 목록에서도 찾을 수 있습니다 $@.

명령 은 head첫 번째 파일에서 헤더를 추출하는 것으로 시작됩니다.

루프의 다음 명령 sed(일치하는 모든 파일을 반복 File*)은 각 파일의 첫 번째 줄과 마지막 줄을 제외하고 각 파일의 내용을 출력합니다. 이 sed표현식은 1d입력의 첫 번째 줄을 삭제하고 $d마지막 줄을 삭제합니다.

마지막으로 tail마지막 파일의 바닥글을 출력합니다.

모든 출력은 이름이 지정된 디렉터리로 리디렉션됩니다 outfile.

각각 한 줄의 머리글과 바닥글이 포함된 4개의 파일을 사용하여 테스트되었습니다.

$ cat File*
FIRST HEADER
1
2
3
FOOTER
HEADER
1
2
3
FOOTER
HEADER
1
2
3
FOOTER
HEADER
1
2
3
LAST FOOTER

위의 명령을 실행하세요. 그런 다음,

$ cat outfile
FIRST HEADER
1
2
3
1
2
3
1
2
3
1
2
3
LAST FOOTER

답변2

Kindly try with below steps and it worked fine

step1:

for i in file1 file2.........filen; do sed -i -e '1d' -e '$d' $i;cat $i >>final_file; done

step2

sed -i '1i Name' final_file

step3

sed '$s/.*/&\nNext date/g' final_file

답변3

이 awk를 사용해 볼 수 있습니다.

cat script_awk 
NR == 1 {
# keep first header in a
  a = $0
  next
}
FNR == 1 {
# remove last line of File_n and header of File_n+1 
  a=""
  next
}
{
if ( a )
# print previous line
  print a
# keep last line in a
  a=$0
}
END {
# print the last line (footer of last File)
  print a
}

다음과 같이 호출하세요.

awk -f script_awk File1 File2 File10

다음과 같이 호출할 수 있습니다.

awk -f script_awk File*

하지만 File10의 바닥글을 얻었는지 확실하지 않습니다.

관련 정보