複数のファイルをマージする sed コマンド

複数のファイルをマージする sed コマンド

複数のファイルを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

headtailおよび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のフッターを得たかどうかはわかりません。

関連情報