Linuxで一致する文字列に基づいて単一のファイルを複数のファイルに分割する

Linuxで一致する文字列に基づいて単一のファイルを複数のファイルに分割する

次の内容を含むファイルがあります。

ファイル.txt:

661###############20160315###
###########################
###########################
661###############20160316###
###########################
661###############20160317###
###########################

この単一ファイルを開始文字列「661」と日付(2016MMDD)に基づいて複数のファイルに分割し、分割ファイルの名前を20160315.txt、20160316.txtなどに変更したいと思います。たとえば、各分割ファイルには次のものが含まれます。

20160315.txt には以下が含まれます。

661###############20160315########
################################
################################

20160316.txt には以下が含まれます。

661###############20160316########
################################

20160317.txt には以下が含まれます。

661###############20160317#######
###############################

これを実行できるawkコマンドはありますか?

ベストアンサー1

これを行うためのコマンドがあると確信していますが、解決策を提示するのに十分awk熟練していません。awkその間、次のように使用できます。

#!/bin/bash

csplit -z tosplit /661/ {*}

for file in xx*; do
    newName=$(egrep -o '2[0-9]{7}' $file)
    mv $file $newName.txt
done
rm -rf xx*

このファイルtosplit(例ファイル)はどこにありますか?

661###############20160315###
###########################
###########################
661###############20160316###
###########################
661###############20160317###
###########################

このスクリプト(filesと同じディレクトリにありますtosplit)を実行すると、3つのファイルが生成されます。

ls 2016031*
20160315.txt  20160316.txt  20160317.txt

...次のようになります。

cat 20160315.txt 
661###############20160315###
###########################
###########################

cat 20160316.txt 
661###############20160316###
###########################

cat 20160317.txt 
661###############20160317###
###########################

ファイル名を指定(?)することもできますが、csplitそれも私の給料を越えることです!

おすすめ記事