여러 파일을 하나의 파일로 병합하고 첫 번째 파일 머리글과 마지막 파일 바닥글을 제외한 모든 파일의 머리글과 바닥글을 제거하고 싶습니다.
예를 들어 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
, tail
및 sed
:을 사용하십시오 .
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의 바닥글을 얻었는지 확실하지 않습니다.