10個のファイルを1つにマージするPerlスクリプトを作成しました。各ファイルには、ファイルにキーワードのタイトル/予告編があります。したがって、マージされたファイルには複数のヘッダーとトレーラーキーワードがあります。ただし、タイトルとトレーラーはマージされたファイルの先頭と末尾にのみ表示されるように要求します。
例:
ファイル1.txt -->
Header
Content1
Trailer
ファイル2.txt -->
Header
Content2
Trailer
Merged.txt(現在) - >
Header
Content1
Trailer
Header
Content2
Trailer
Merged.txt(必須) - >
Header
Content1
Content2
Trailer
ベストアンサー1
私はそれをします:
perl -i -lne 'print unless ($_ eq "Header" && $. > 1) || ($_ eq "Trailer" && !eof)' your-file
これは次の方法で行うこともできますsed
。
sed -e 1b -e '$b' -e '/^Header$/d' -e '/^Trailer$/d' your-file
一部sed
の実装では Perl スタイルの内部編集が可能で、一部 (ほとんど) はこれを使用し、-i
一部 (FreeBSD および macos を含む派生製品) は使用します。-i ''
マージ時に追加のヘッダー/トレーラーを削除できます。
perl -lne '
if (eof) {
$n++; # counts files
close ARGV; # resets $.
next if @ARGV; # if there are more files to process
}
print unless $. == 1 && $n # first list and not first file
' file<->.txt(n)
(file<->.txt(n)
数値でfile<number>.txt
並べ替えを一致させるにはn
(したがって、file10.txt
間で並べ替えるには)、間file9.txt
file11.txt
で並べ替えたくない場合はシェルが必要です)file1.txt
file2.txt
zsh
またはGNUを使用してsed
(まだzsh
):
() {
head -n1 < $1
sed -s -- '1d;$d' "$@"
tail -n1 < $argv[-1]
} file<->.txt(n)