문자열을 가져와서 다음 문자열을 찾을 때까지 줄의 시작 부분에 넣습니다.

문자열을 가져와서 다음 문자열을 찾을 때까지 줄의 시작 부분에 넣습니다.

나는 데이터를 MySQL 데이터베이스에 저장하는 데 필요한 기본 사항을 반복하기 위해 sed(약 4회)를 사용하는 큰 비표준 xhtml 파일을 가지고 있습니다. 나의 마지막 작은 투쟁. 이 파일의 형식은 다음과 같습니다.

 Tue Aug 18 2015
0,0,0,0,0
0,0,0,2,275
0,0,0,3,287
0,0,0,0,327
0,0,0,3,335
0,0,0,0,413
 Wed Aug 19 2015
0,0,0,0,0
0,0,0,2,275
0,0,0,3,287
0,0,0,2,308
 Thu Aug 20 2015
0,0,0,0,0
0,0,0,2,458
0,0,0,3,469
0,0,0,0,472
0,0,0,3,503
0,0,0,2,534

이 날 앞에는 항상 공백이 있습니다. 날짜 뒤에는 CSV 값 행이 여러 개 있을 수 있습니다.

내가 달성하고자하는 것은 다음과 같습니다.

Tue Aug 18 2015,0,0,0,0,0
Tue Aug 18 2015,0,0,0,2,275
Tue Aug 18 2015,0,0,0,3,287
Tue Aug 18 2015,0,0,0,0,327
Tue Aug 18 2015,0,0,0,3,335
Tue Aug 18 2015,0,0,0,0,413
Wed Aug 19 2015,0,0,0,0,0
Wed Aug 19 2015,0,0,0,2,275
Wed Aug 19 2015,0,0,0,3,287
Wed Aug 19 2015,0,0,0,2,308
Thu Aug 20 2015,0,0,0,0,0
Thu Aug 20 2015,0,0,0,2,458
Thu Aug 20 2015,0,0,0,3,469
Thu Aug 20 2015,0,0,0,0,472
Thu Aug 20 2015,0,0,0,3,503
Thu Aug 20 2015,0,0,0,2,534

가능하다면 날짜를 제거하고 쉼표를 추가하여 PHP 스크립트에서 더 쉽게 조작할 수 있도록 하십시오. 예를 들면 다음과 같습니다.

Aug,18,2015,0,0,0,0,0
Aug,18,2015,0,0,0,2,275
Aug,18,2015,0,0,0,3,287
Aug,18,2015,0,0,0,0,327
Aug,18,2015,0,0,0,3,335
Aug,18,2015,0,0,0,0,413
Aug,19,2015,0,0,0,0,0
Aug,19,2015,0,0,0,2,275
Aug,19,2015,0,0,0,3,287
Aug,19,2015,0,0,0,2,308
Aug,20,2015,0,0,0,0,0
Aug,20,2015,0,0,0,2,458
Aug,20,2015,0,0,0,3,469
Aug,20,2015,0,0,0,0,472
Aug,20,2015,0,0,0,3,503
Aug,20,2015,0,0,0,2,534

사용할 수 있는 명령이 있습니까?

답변1

한 가지 방법은 다음과 같습니다.

sed '/,/!{                       # if there's no comma on this line
y/ /,/                           # translate spaces to commas
h                                # copy pattern space over the hold buffer
d                                # delete pattern space
}
//{                              # if the line contains commas
G                                # append hold space content to pattern space
s/\(.*\)\n,[^,]*,\(.*\)/\2,\1/   # swap lines removing newline, the day part and
}                                # first two commas and adding a comma after year
' infile

gnu sed한 줄을 선호하는 경우 :

sed -E '/,/!{y/ /,/;h;d};//{G;s/(.*)\n,[^,]*,(.*)/\2,\1/}' infile

다음과 같습니다 awk.
행에 쉼표가 포함되어 있지 않으면 날짜 형식을 지정하고 sprintf결과를 변수(예: )에 저장한 dt다음 next로그로 이동하여 수행할 수 있습니다. 그렇지 않으면 그냥 추가하세요 dt( $0즉, 현재 줄):

awk '!/,/{dt=sprintf("%s,%s,%s,", $2, $3, $4);next};$0=dt$0' infile

답변2

awk -F, -v OFS=, '/^[[:blank:]]+/ {
                      str=gensub(/ /,",","g",$0);
                      sub(/^,+[^,]+,/,"",str);
                      next
                  };

                  !/^[[:blank:]]+/ {print str,$0}' nick.txt

(물론 한 줄에 모두 작성할 수도 있습니다. 한 줄로 작성하여 테스트한 다음 여기에서 더 읽기 쉽도록 줄바꿈과 들여쓰기를 추가했습니다.)

하나 또는 공백 문자(예: 공백 또는 탭)로 시작하는 줄의 경우 이 awk스크립트는 모든 공백을 쉼표로 변환하고 수정된 줄을 변수라는 변수에 저장한 str다음 첫 번째 쉼표와 줄을 포함한 모든 텍스트를 제거합니다.

공백 문자로 시작하지 않는 줄의 경우 현재 값이 앞에 붙은 줄을 인쇄합니다 str.

경고: CSV 데이터 행이 있는 경우앞으로첫 번째 날짜 행, 이 행은 접두사로 단일 쉼표만 사용하여 인쇄됩니다.

산출:

Aug,18,2015,0,0,0,0,0
Aug,18,2015,0,0,0,2,275
Aug,18,2015,0,0,0,3,287
Aug,18,2015,0,0,0,0,327
Aug,18,2015,0,0,0,3,335
Aug,18,2015,0,0,0,0,413
Aug,19,2015,0,0,0,0,0
Aug,19,2015,0,0,0,2,275
Aug,19,2015,0,0,0,3,287
Aug,19,2015,0,0,0,2,308
Aug,20,2015,0,0,0,0,0
Aug,20,2015,0,0,0,2,458
Aug,20,2015,0,0,0,3,469
Aug,20,2015,0,0,0,0,472
Aug,20,2015,0,0,0,3,503
Aug,20,2015,0,0,0,2,534

관련 정보