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)를 실행하면 세 개의 파일이 생성됩니다.

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

...다음과 같습니다:

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

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

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

파일 이름 을 지정(?)할 수도 있지만 csplit그것도 내 월급을 넘어서는 일이에요!

답변2

awk비슷한 것으로

awk '/^661/{f=substr($0,match($0,/2016[0-9]{4}/),8)".txt"}{print>>f}' file.txt

당신에게 적합할 수도 있습니다.

기본적으로 부품은 다음과 같습니다.

/^661/{...} # on each line starting with 661

match($0,/2016[0-9]{4}/) # find the index of the date (2016MMDD) in current line

substr($0,match($0,/2016[0-9]{4}/),8) # extract the the date in the current line

f=substr($0,match($0,/2016[0-9]{4}/),8)".txt" # assign it to f and append ".txt"

{print>>f} # redirect the content of the current line into the file named by f

레거시 awk구현의 경우 교체해야 할 수도 있습니다.간격 표현도착하다:

awk '/^661/{f=substr($0,match($0,/2016[01][0-9][0-9][0-9]/),8)".txt"}{print>>f}' file.txt

사용 사례에 따라 변경하고 싶을 수도 있습니다.리디렉션 동작, 즉 , print>fprint>>f

관련 정보