複数のファイルを1つのファイルにマージし、最初のファイルヘッダーと最後のファイルフッターを除くすべてのファイルのヘッダーとフッターを削除したいと思います。
たとえば、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
。
それぞれ1行のヘッダーとフッターを含む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のフッターを得たかどうかはわかりません。