2010-02-05 4 views
8

여기 내 상황입니다 : 내가로부터 특정 정보를 끌어 싶어 큰 텍스트 파일을했다. 나는 sed를 사용하여 regexp 's를 기반으로 모든 관련 정보를 가져 왔지만, 내가 가져온 정보의 "조각"은 각각 별도의 줄에 있으며 각 "레코드"가 자체 줄에 있어야 쉽게 가져올 수 있습니다. DB.
여기 지금 내 데이터의 샘플입니다 :다음 줄의 첫 번째 문자를 기반으로 줄 바꿈을 제거하는 AWK를 사용하여 (또는 나오지도)

92831,499,000
, 0,644,321
79217,999,000
, 5,417,178
, PK91622
, 이상적으로 PK90755

,

:이 출력과 같이 할 것 0

92831,499,000 , 0,644,321
79217,999,000 , 5,417,178 , PK91622
79217,999,000 , 5,417,178 , PK90755

이 할 어렵게 될 수있다, 그래서 정착 것 마지막 "레코드"의 출력이 추가 "PK ..."와 함께 한 번만 나타나서 해당 줄의 네 번째 "필드"가됩니다. 선이 줄 바꿈이 제거되어야하기 전에 (^) 쉼표로 시작하면 결국
, 나는이 일을 생각할 수있는 가장 간단한 방법은 그래서 당신이 줄 수 있다면 비록 내가 AWK 너무 익숙하지 난 ...입니다 나에게 이것에 시작은 진짜로 평가 될! 감사!

답변

2

글쎄, 내가 10 분 나는 그것을 작업 가지고 그들을보고 후 ... 지난 밤이를 알아 내려고 할 때 AWK 레코드를 사용하여 좀 더 자세히 살펴 했어야 같아요. 여기에 관심이있는 사람은 다음과 같습니다. 내 원래의 sed 스크립트에서 각 레코드의 시작 부분에 추가로 개행 문자를 추가 했으므로 각 행마다 빈 줄이 생깁니다. '= ""{RS를 BEGIN

AWK; 나는 다음 awk 명령을 사용하여 FS의 = "\ n"}
{
경우 (NF> = 3)에 대한
(I = 3; 내가 ++; I < = NF)
인쇄 $ 1, $ 2, $ I
}

은 그것은 내가 원하는 방식 그대로를 출력하는 매력처럼 작동합니다!

+0

+1 때로는 간단한 프로그램> 정규식 – gbarry

1
sedsed -d -n ':t;/^,/!x;H;n;/^,/{x;$!bt;x;H};x;s/\n//g;p;${x;/^,/!p}' filename 
1

특별한 케이싱 필드 3없이 쉽다. 더 복잡하지만 여전히 너무 열심히

awk ' 
    !/^,/ { if (NR > 1) print x ; x = $0 } 
    /^,/ { x = x OFS $0 } 
    END  { if (NR) print x } 
' 

.

awk ' 
    !/^,/ { if (n && n < 3) print x ; x = $0 ; n = 1 } 
    /^,/ { if (++n > 2) { print x, $0 } else { x = x OFS $0 } } 
    END  { if (n && n < 3) print x } 
' 
5
 
$ perl -0pe 's/\n,/,/g' < test.dat 
92831,499,000,0644321 
79217,999,000,5417178,PK91622,PK90755 

번역 : 라인을 분리하지 않고 대량으로 읽기, 그냥 쉼표로 줄 바꿈 다음 각 쉼표를 교환합니다.

최단 코드는 여기에 있습니다.

1

이 당신을 위해 작동 될 수 있습니다

# sed ':a;N;s/\n,/,/;ta;P;D' test.dat | sed 's/,/\n/5;s/\(.*,\).*\n/&\1/' 
92831,499,000,0644321 
79217,999,000,5417178,PK91622 
79217,999,000,5417178,PK90755 

설명 :

다음 라인을 추가하고, 추가 라인이 ,로 시작하는 경우 다음의 삭제 :

이 두 부분으로 제공 새 줄 \n을 삽입하고 다시 시작하십시오. 줄 바꿈까지 인쇄하지 않으면 새 줄까지 삭제하십시오. 반복.

다섯 번째 ,을 새 라인으로 교체하십시오. 그런 다음 삽입 된 개행과 여섯 번째 필드 사이에 처음 네 개의 필드를 삽입하십시오.

관련 문제