
다음과 같은 내용을 가진 파일이 있습니다.
파일.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###
###########################
이 스크립트를 (파일과 동일한 디렉터리에서 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>f
대 print>>f
.